設計模式--命令模式C++實現


命令模式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中進行封裝以及默認的指定。從而命令的單一職責,與接受者無關 且  高層無需了解調用時的接受者是誰


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM