C++設計モード10--コマンドモード(一)--要求送信者と受信者の結合を低減する
コマンドモードの概要
ソフトウェアシステムでは、動作要求者と動作実装者は、通常、「緊密な結合」を示す.しかし、場合によっては、動作を「記録、取り消し/やり直し、トランザクション」などの処理を行うなど、変化を防ぐことができない緊密な結合は適切ではありません.この場合、「動作リクエスト者」と「動作実装者」をどのようにデカップリングしますか?1組の挙動をオブジェクトとして抽象化し,両者の間の緩和結合を実現した.これがコマンドモード(Command Pattern)
仕事をして一日疲れて、シャワーを浴びて、テレビをつけて好きな番組があるかどうかを見て、リモコンを取って、上のボタンを見て、突然奇妙な感じがして、私たちは電源を入れるボタンを押して、テレビはつけて、それから...ははは、本当に面白いですね.私は私を押します.考えてみれば、これはコマンドモードではないでしょうか.
コマンドモード構造
Command
コマンドのインタフェースを定義し、実行方法を宣言します.
ConcreteCommand
コマンドインタフェース実装オブジェクトは、「虚」の実装である.通常、受信者は保持され、受信者の機能を呼び出してコマンドの実行を完了します.
Receiver
受信者、本当にコマンドを実行するオブジェクト.任意のクラスは、コマンド要件が実装される対応する機能を実現できる限り、受信者になる可能性があります.
Invoker
コマンドオブジェクトにリクエストを実行するように要求します.通常はコマンドオブジェクトを持ち、多くのコマンドオブジェクトを持つことができます.これは、クライアントが本当にコマンドをトリガし、コマンドに対応する操作を要求する場所、すなわちコマンドオブジェクトを使用するエントリに相当する.
Client
特定のコマンドオブジェクトを作成し、コマンドオブジェクトの受信者を設定します.これは私たちの通常の意味でのクライアントではなく、コマンドオブジェクトと受信者を組み立てることに注意してください.もしかすると、このClientをアセンブリと呼ぶと、本当にコマンドを使用しているクライアントはInvokerから実行をトリガーしているので、より理解しやすいかもしれません.
うんてんモード
①Clientは、C/C++においてマスター関数またはメンバー関数であり、ConcreteCommandオブジェクトを作成し、Receiverオブジェクトを指定する②あるInvokerオブジェクトは、ConcreteCommandオブジェクトを格納する③このInvokerは、CommandオブジェクトのExecute操作を呼び出すことによって要求を発行する.コマンドが取り消すことができる場合、ConcreteCommandは、Executeアクションを実行する前に、コマンド④ConcreteCommandオブジェクトから呼び出されたReceiverに対するいくつかのアクションを取り消すための現在のステータスを格納し、リクエストを実行する.
きほんコード
命令受信者を見て
命令受信者こそ命令の真の実行者である
コマンドインタフェースを見てみましょう
コマンドインタフェースのインプリメンテーションオブジェクトで、コマンドを実行します.通常、受信者を持ち、コマンドが実行する操作を完了するために受信者の機能を呼び出します.
次にリクエスト送信者を見てみましょう
コマンドオブジェクトにリクエストを実行するように要求します.通常はコマンドオブジェクトを持ち、多くのコマンドオブジェクトを持つことができます.
最後にクライアント、すなわちメインプログラム
ソフトウェアシステムでは、動作要求者と動作実装者は、通常、「緊密な結合」を示す.しかし、場合によっては、動作を「記録、取り消し/やり直し、トランザクション」などの処理を行うなど、変化を防ぐことができない緊密な結合は適切ではありません.この場合、「動作リクエスト者」と「動作実装者」をどのようにデカップリングしますか?1組の挙動をオブジェクトとして抽象化し,両者の間の緩和結合を実現した.これがコマンドモード(Command Pattern)
仕事をして一日疲れて、シャワーを浴びて、テレビをつけて好きな番組があるかどうかを見て、リモコンを取って、上のボタンを見て、突然奇妙な感じがして、私たちは電源を入れるボタンを押して、テレビはつけて、それから...ははは、本当に面白いですね.私は私を押します.考えてみれば、これはコマンドモードではないでしょうか.
コマンドモード構造
Command
コマンドのインタフェースを定義し、実行方法を宣言します.
ConcreteCommand
コマンドインタフェース実装オブジェクトは、「虚」の実装である.通常、受信者は保持され、受信者の機能を呼び出してコマンドの実行を完了します.
Receiver
受信者、本当にコマンドを実行するオブジェクト.任意のクラスは、コマンド要件が実装される対応する機能を実現できる限り、受信者になる可能性があります.
Invoker
コマンドオブジェクトにリクエストを実行するように要求します.通常はコマンドオブジェクトを持ち、多くのコマンドオブジェクトを持つことができます.これは、クライアントが本当にコマンドをトリガし、コマンドに対応する操作を要求する場所、すなわちコマンドオブジェクトを使用するエントリに相当する.
Client
特定のコマンドオブジェクトを作成し、コマンドオブジェクトの受信者を設定します.これは私たちの通常の意味でのクライアントではなく、コマンドオブジェクトと受信者を組み立てることに注意してください.もしかすると、このClientをアセンブリと呼ぶと、本当にコマンドを使用しているクライアントはInvokerから実行をトリガーしているので、より理解しやすいかもしれません.
うんてんモード
①Clientは、C/C++においてマスター関数またはメンバー関数であり、ConcreteCommandオブジェクトを作成し、Receiverオブジェクトを指定する②あるInvokerオブジェクトは、ConcreteCommandオブジェクトを格納する③このInvokerは、CommandオブジェクトのExecute操作を呼び出すことによって要求を発行する.コマンドが取り消すことができる場合、ConcreteCommandは、Executeアクションを実行する前に、コマンド④ConcreteCommandオブジェクトから呼び出されたReceiverに対するいくつかのアクションを取り消すための現在のステータスを格納し、リクエストを実行する.
きほんコード
命令受信者を見て
命令受信者こそ命令の真の実行者である
// ,
class Receiver
{
public :
virtual void Action()
{
std::cout <
コマンドインタフェースを見てみましょう
コマンドインタフェースのインプリメンテーションオブジェクトで、コマンドを実行します.通常、受信者を持ち、コマンドが実行する操作を完了するために受信者の機能を呼び出します.
//
class Command
{
public :
virtual void Execute( ) = 0; //
};
// , ,
// , 。
class ConcreteCommand : public Command
{
public :
ConcreteCommand(Receiver *receiver)
{
this->receiver = receiver;
}
void Execute()
{
// ,
receiver->Action();
}
protected:
Receiver *receiver; //
};
次にリクエスト送信者を見てみましょう
コマンドオブジェクトにリクエストを実行するように要求します.通常はコマンドオブジェクトを持ち、多くのコマンドオブジェクトを持つことができます.
// ,
// ,
class Invoker
{
public :
void SetCommand(Command *command)
{
this->command = command;
}
void RunCommand()
{
command->Execute();
}
protected:
Command *command;
};
最後にクライアント、すなわちメインプログラム
int main( )
{
//
Receiver *receiver = new Receiver;
// ,
Command *command = new ConcreteCommand(receiver);
// Invoker,
Invoker *invoker = new Invoker;
invoker->SetCommand(command); // invoker command
invoker->RunCommand( ); //
}
ここでは、コマンドモードの基礎概念と基本コード実装について簡単に説明します.次は具体的な例で実現し、皆さんの理解を便利にします.