Der Befehlsmodus kapselt eine Anforderung als Objekt, sodass Sie Clients mit unterschiedlichen Anforderungen in die Warteschlange stellen oder Anforderungsprotokolle aufzeichnen und umkehrbare Vorgänge unterstützen können.
Testfall:
[code]int main(){ Barbecuer boy; BakeChickenWingCommand bakechickenwingcommand1(boy); BakeChickenWingCommand bakechickenwingcommand2(boy); BakeMuttonCommand bakemuttoncommand1(boy); BakeMuttonCommand bakemuttoncommand2(boy); Waiter girl; girl.SetOrder(&bakechickenwingcommand1); girl.SetOrder(&bakechickenwingcommand2); girl.SetOrder(&bakemuttoncommand1); girl.SetOrder(&bakemuttoncommand2); girl.Notify(); girl.CancelOrder(&bakechickenwingcommand2); girl.Notify(); return 0; }
Klassenimplementierung:
[code]class Barbecuer{ public: void BakeMutton() { cout << "Meat\n"; } void BakeChickenWing() { cout << "Chicken\n"; } }; class Command{ protected: Barbecuer receiver; public: Command(){} Command(Barbecuer & b) :receiver(b){} virtual void ExcuteCommand() = 0; }; class BakeMuttonCommand :public Command{ public: BakeMuttonCommand(Barbecuer & b) { receiver = b; } void ExcuteCommand(){ receiver.BakeMutton(); } }; class BakeChickenWingCommand :public Command{ public: BakeChickenWingCommand(Barbecuer & b) { receiver = b; } void ExcuteCommand(){ receiver.BakeChickenWing(); } }; class Waiter{ list<Command *>orders; public: void SetOrder(Command * comptr); void CancelOrder(Command * comptr); void Notify(); }; void Waiter::SetOrder(Command * comptr){ orders.push_back(comptr); cout << "Add order\n"; } void Waiter::CancelOrder(Command * comptr){ orders.remove(comptr); cout << "Cancel order\n"; } void Waiter::Notify(){ for each (Command * var in orders){ var->ExcuteCommand(); } }
Zusammenfassung:
Es ist einfacher, eine Befehlswarteschlange zu entwerfen;
Befehle können bei Bedarf einfach protokolliert werden.
Ermöglicht der Partei, die die Anfrage erhält, zu entscheiden, ob sie ein Veto einlegen möchte.
Die Anfrage kann einfach widerrufen und wiederholt werden.
Da das Hinzufügen einer neuen Befehlsklasse keine Auswirkungen auf andere Klassen hat, ist es einfach, neue spezifische Befehlsklassen hinzuzufügen.
Der Befehlsmodus trennt das Objekt, das eine Operation anfordert, von dem Objekt, das weiß, wie eine Operation ausgeführt wird