命令模式C++實現
1定義
將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求隊列或者記錄請求日志,可以提供命令的撤銷和恢復功能
2類圖

角色描述:
Receiver接受者角色,就是干活的碼農,命令傳遞打這里就應該被執行。
Command命令角色,對命令額封裝,所有命令聲明在此
Invoker調用者角色,接受到命令並且執行命令
3實現
class Receiver
{
protected:
Receiver();
public:
virtual ~Receiver() = 0;
virtual void doSomething()=0;
};
class ConcreteReceiver:public Receiver
{
public:
void doSomething()
{
cout << "doSomething...."<<endl;
}
};
claas Command
{
protected:
Command();
public:
virtual ~Command() = 0;
virtual void execute() = 0;
};
class ConcreteCommand:public Command
{
public:
ConcreteCommand(Receiver* re)
:_receiver(re)
{}
~ConcreteCommand(){}
void execute()
{
_receiver.doSomething();
}
protected:
Receiver * _receiver;
};
class Invoke
{
private:
Command * _cmd;
public:
void setCommand(Command * cmd)
{
_cmd = cmd;
}
void action()
{
_cmd->execute();
}
};
4應用
① 優點
類間解耦
可擴展性
結合其他模式更加優秀:結合責任鏈模式實現命令族解析任務;結合模板方法,減少Command子類的膨脹
②缺點
命令越多,類約膨脹,需要慎用
③使用場景
只要認為是命令的地方。eg GUI 開發,按鈕,DOS命令模擬,觸發反饋機制的處理等
5擴展
①當一個命令需要多個接收者/執行者時,可以在命令內set多個接受者,完成通力合作的問題
②反悔問題,這個就設計備忘錄模式了。或者通過反向鏈式存儲機制得到前次記錄,實現回滾。rollback
注:在項目中,約定的優先級最高,每個命令都是對一個或者多個接受者的封裝。在項目中可以通過有意義的命名來實現Client和Receiver間的依賴描述
6 提升
可以將接受者在Command中進行封裝以及默認的指定。從而命令的單一職責,與接受者無關 且 高層無需了解調用時的接受者是誰
