機能
あなたが別の要求をクライアントにパラメータ化することができますので、それは、オブジェクトとして要求をカプセル化します。
解きます
- 主なソリューション:ソフトウェアシステム、行動や振る舞いで、リクエスタを達成するためには、通常、密結合の関係であるが、そのようなトランザクション処理などの記録、アンドゥやリドゥを実施する必要性など、いくつかの状況では、、、これは抵抗することはできません密結合設計変更は適切ではありません
- ときに使用する:いくつかのケースでは、そのような「レコード、アンドゥ/リドゥ、トランザクション」および他の処置の挙動として、そのような変更は、密結合に抵抗することができないことは適切ではありません。この場合、どのように「行為の要求者」と「行動の実装者は、」デカップリングのだろうか?抽象オブジェクトのグループの挙動は、両者間の疎結合を達成することができます
- 解決方法:ファイル名を指定して実行を受信者が発信者を呼び出すために、この順序で:→→コマンド発信者、受信者を
- キーコード:3つの役割の定義:1、コマンド実際の受信は2、コマンド3、呼出し使用コマンドオブジェクト入口オブジェクト
長所と短所
- 利点:
- システムは、結合の程度を減少させます
- 新しいコマンドは、容易にシステムに追加することができます
- 短所:一部のシステムでは、あまりにも多くの特定のコマンドクラスを持っている可能性があり、コマンドモードを使用します
シナリオ
- アプリケーション例:コア・コントローラのActionServletの支柱1つのみのアクション、等価インボーカ、およびモデルベースの層は、特定のコマンドに対応し、アプリケーションの異なるクラスと異なるモデルを有することができます
- 使用シナリオ:各ボタンコマンドであり、1 GUIをローカルコマンドのような、コマンドモードを使用することができます。2、シミュレーションCMD
- 注:アンドゥ(元に戻す)とリカバリ操作(やり直し)運用サポートコマンドへのシステムのニーズが、あなたはまた、拡張コマンドモードを参照して、コマンドモードを使用することを検討することができます
簡単な例のコードセクション
Command.h
#ifndef _COMMAND_H_
#define _COMMAND_H_
#include <iostream>
using namespace std;
class Reciever{
public:
Reciever(){}
~Reciever(){}
void Action(){
std::cout<<"Reciever action......."<<std::endl;
}
};
class Command {
public:
virtual ~Command(){}
virtual void Excute() = 0;
protected:
Command(){}
};
class Invoker {
public:
Invoker(Command* cmd){
_cmd=cmd;
}
~Invoker(){}
void Invoke(){}
private:
Command* _cmd;
};
class ConcreteCommand:public Command {
public:
ConcreteCommand(Reciever* rev){
_rev=rev;
}
~ConcreteCommand(){}
void Excute(){}
private:
Reciever* _rev;
};
template <class Reciever>
class SimpleCommand:public Command {
public:
typedef void (Reciever::* Action)();
SimpleCommand(Reciever* rev,Action act){
_rev = rev;
_act = act;
}
virtual void Excute() {
(_rev->* _act)();
}
~SimpleCommand() {
delete _rev;
}
private:
Reciever* _rev;
Action _act;
};
#endif
main.cppに
#include "Command.h"
#include <iostream>
using namespace std;
int main() {
Reciever* rev = new Reciever();
Command* cmd = new SimpleCommand<Reciever>(rev,&Reciever::Action);
cmd->Excute();
Command* cmd2 = new ConcreteCommand(rev);
Invoker* inv = new Invoker(cmd2);
inv->Invoke();
return 0;
}