生活随笔
收集整理的這篇文章主要介紹了
C++之命令(Command)模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
0. 簡介
我們在遇到類似GUI中多種Button點擊功能的操作時,我們應該將請求的所有細節 (例如調用的對象、 方法名稱和參數列表) 抽取出來組成命令類, 該類中僅包含一個用于觸發請求的方法。
命令模式就是這樣一種行為設計模式, 它可將請求轉換為一個包含與請求相關的所有信息的獨立對象。 并能根據不同的請求將方法參數化、 延遲請求執行或將其放入隊列中, 且能實現可撤銷操作。
1. 命令模式示意圖
命令模式可將特定的方法調用轉化為獨立對象。 這一改變也帶來了許多有趣的應用: 你可以將命令作為方法的參數進行傳遞、 將命令保存在其他對象中, 或者在運行時切換已連接的命令等。
Command(抽象命令類):抽象出命令對象,可以根據不同的命令類型。寫出不同的實現類
Concrete Command(具體命令類):實現了抽象命令對象的具體實現
Invoker(調用者/請求者):請求的發送者,它通過命令對象來執行請求。一個調用者并不需要在設計時確定其接收者,因此它只與抽象命令來之間存在關聯。在程序運行時,將調用命令對象的execute() ,間接調用接收者的相關操作。
Receiver(接收者):接收者執行與請求相關的操作,真正執行命令的對象。具體實現對請求的業務處理。未抽象前,實際執行操作內容的對象。
Client(客戶端):在客戶類中需要創建調用者對象,具體命令類對象,在創建具體命令對象時指定對應的接收者。發送者和接收者之間沒有之間關系。都通過命令對象來調用。
2. 示例程序
責任鏈模式和命令模式用于處理請求發送者和接收者之間的不同連接方式。責任鏈按照順序將請求動態傳遞給一系列的潛在接收者, 直至其中一名接收者對請求進行處理。命令模式則是在發送者和請求者之間建立單向連接。
作為命令模式的作用,非常明顯,它可以通過某些行為來參數化對象。從而避免了繼承導致的調用與接收的緊耦合。命令模式則是分離了這兩者,修改時只需要添加接收者并創建新的實例化具體命令類即可實現整套代碼的調用。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>using namespace std
;
class Receiver
{
public:void BakeMutton(){cout
<< "烤羊肉"<< endl
;}void BakeChicken(){cout
<< "烤雞翅"<< endl
;}
};
class Command
{
public:Command(Receiver
* pstReceiver
):m_pstReceiver(pstReceiver
){}virtual void Excute() = 0;protected:Receiver
* m_pstReceiver
;
};
class ConcreteCommandA: public Command
{
public:ConcreteCommandA(Receiver
* pstReceiver
):Command(pstReceiver
){}virtual void Excute(){cout
<< "ConcreteCommandA excuting......"<< endl
;m_pstReceiver
->BakeMutton();}};
class ConcreteCommandB: public Command
{
public:ConcreteCommandB(Receiver
* pstReceiver
):Command(pstReceiver
){}virtual void Excute(){cout
<< "ConcreteCommandB excuting......"<< endl
;m_pstReceiver
->BakeChicken();}
};
class Invoke
{
public:void Add(Command
* pstCommand
){m_vecPstCommand
.push_back(pstCommand
);}void Remove(Command
* pstCommand
){m_vecPstCommand
.erase(find(m_vecPstCommand
.begin(), m_vecPstCommand
.end(), pstCommand
));}void RemoveAll(){m_vecPstCommand
.clear();}void Notify(){for (typeof(m_vecPstCommand
.begin()) it
= m_vecPstCommand
.begin(); it
!= m_vecPstCommand
.end(); ++it
){(*it
)->Excute();}}private:vector
<Command
*> m_vecPstCommand
;
};int main(int argc
, char* argv
[])
{Receiver
* pstReceiver
= new Receiver();Command
* pstConcreteCommandA
= new ConcreteCommandA(pstReceiver
);Command
* pstConcreteCommandB
= new ConcreteCommandB(pstReceiver
);Invoke
* pstInvoke
= new Invoke();pstInvoke
->Add(pstConcreteCommandA
);pstInvoke
->Add(pstConcreteCommandA
);pstInvoke
->Add(pstConcreteCommandB
);pstInvoke
->Notify();cout
<< "------------------"<< endl
<< endl
;pstInvoke
->Remove(pstConcreteCommandA
); pstInvoke
->Remove(pstConcreteCommandB
);pstInvoke
->Notify();cout
<< "------------------"<< endl
<< endl
;return 0;
}
…詳情請參照古月居
總結
以上是生活随笔為你收集整理的C++之命令(Command)模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。