コマンド モード (コマンド) では、リクエストをオブジェクトとしてカプセル化し、さまざまなリクエストでクライアントをパラメータ化することができ、リクエストをキューに入れたり、リクエスト ログを記録したり、可逆操作をサポートしたりできます。
テストケース:
[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; }
クラス実装:
[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(); } }
概要:
必要に応じてコマンドをログに記録することが簡単になります。 request;
リクエストの取り消しとやり直しは簡単に実装できます
新しいコマンド クラスを追加しても他のクラスに影響を与えないため、新しい特定のコマンド クラスを追加するのは簡単です。
コマンドモードは、操作を要求するオブジェクトと操作の実行方法を知っているオブジェクトを分離します