[C++設計モード]commandコマンドモード


ソフトウェアシステムでは、動作要求者と動作実装者は、通常、「緊密な結合」を示す.しかし、場合によっては、動作を「記録、取り消し/やり直し、トランザクション」などの処理を行うなど、変化を防ぐことができない緊密な結合は適切ではありません.この場合、「動作リクエスト者」と「動作実装者」をどのようにデカップリングしますか?1組の挙動をオブジェクトとして抽象化し,両者の間の緩和結合を実現した.これがコマンドモード(Command Pattern)です.
OOPの中で、すべては対象で、要求を対象にカプセル化して、OOPの設計思想に合って、取引先の単一の要求を対象にカプセル化した後に、私達はこの要求に対してもっと多くの情報を格納することができて、要求にもっと多くの能力を持つようにします;コマンドモードは、要求送信者と受信者を同様にデカップリングすることができ、命令送信者は、要求がどのように処理されるかに関心を持たなくてもよい.
Command:コマンドのインタフェースを定義し、実行方法を宣言します.ConcreteCommand:コマンドインタフェース実装オブジェクト、「虚」実装;通常、受信者は保持され、受信者の機能を呼び出してコマンドの実行を完了します.Receiver:受信者、本当にコマンドを実行するオブジェクト.任意のクラスは、コマンド要件が実装される対応する機能を実現できる限り、受信者になる可能性があります.Invoker:コマンドオブジェクトにリクエストを実行するように要求します.通常はコマンドオブジェクトを持ち、多くのコマンドオブジェクトを持つことができます.これは、クライアントが本当にコマンドをトリガし、コマンドに対応する操作を要求する場所、すなわちコマンドオブジェクトを使用するエントリに相当する.Client:特定のコマンドオブジェクトを作成し、コマンドオブジェクトの受信者を設定します.これは私たちの通常の意味でのクライアントではなく、コマンドオブジェクトと受信者を組み立てることに注意してください.もしかすると、このClientをアセンブリと呼ぶと、本当にコマンドを使用しているクライアントはInvokerから実行をトリガーしているので、より理解しやすいかもしれません.
1.コマンドモードの本質は、コマンドをカプセル化し、コマンドを発行する責任とコマンドを実行する責任を分割することである.2.各コマンドはすべて1つの操作である:要求の一方は要求を出して、1つの操作を実行することを要求する;受信した側は要求を受信し、操作を実行する.3.コマンドモードは、要求の一方と受信の一方が独立して開くことを可能にし、要求の一方が受信要求の一方のインタフェースを知る必要がなく、要求がどのように受信されたか、および操作が実行されたか、いつ実行されたか、およびどのように実行されたかを知る必要がない.4.コマンドモードは、要求自体をオブジェクトとし、他のオブジェクトと同様に格納および伝達することができる.5.コマンドモードの鍵は、抽象コマンドインタフェースを導入し、送信者が抽象コマンドインタフェースに対してプログラミングすることであり、抽象コマンドインタフェースを実現した具体的なコマンドのみが受信者に関連付けられる.
class Receiver
{
public:
     void Action()
     {
          cout<<"Receiver->Action"<<endl;
     }
};

class Command
{
public:
     virtual void Execute() = 0;
};

class ConcreteCommand : public Command
{
public:
     ConcreteCommand(Receiver *pReceiver) : m_pReceiver(pReceiver){}
     void Execute()
     {
          m_pReceiver->Action();
     }
private:
     Receiver *m_pReceiver;
};

class Invoker
{
public:
     Invoker(Command *pCommand) : m_pCommand(pCommand){}
     void Invoke()
     {
          m_pCommand->Execute();
     }
private:
     Command *m_pCommand;
};

int main()
{
     Receiver *pReceiver = new Receiver();
     Command *pCommand = new ConcreteCommand(pReceiver);
     Invoker *pInvoker = new Invoker(pCommand);
     pInvoker->Invoke();
     SAFE_DELETE(pInvoker);
     SAFE_DELETE(pCommand);
     SAFE_DELETE(pReceiver);
     return 0;
}