生活随笔
收集整理的這篇文章主要介紹了
                                
命令模式(C++)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            命令模式
 
模式定義
 
命令模式可以對發送者和接收者完全解耦,發送者與接收者之間沒有直接引用關系,發送請求的對象只需要知道如何發送請求,而不必知道如何完成請求。
 
將一個請求封裝為一個對象,從而使我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。
 
模式動機
 
- 敏捷開發的原則告訴我們,不要為代碼添加基于猜測的、實際不需要的功能。如果不清楚一個系統是否需要命令模式,一般就不要著急去實現它,事實上,在需要的時候通過重構實現這個模式并不困難,只有在真正需要如撤銷/恢復操作等功能時,把原來的代碼重構為命令模式才有意義。
UML類圖
 
 
參與者:
 Command:聲明了用于執行請求的execute()等方法,通過這些方法可以調用請求接收者的相關操作。
 ConcreteCommand: 具體執行的命令,將接收者對象的動作綁定其中。
 Invoker:命令的調用者即請求的發送者,要求該命令執行請求。
 Receiver:命令接受者,執行命令的對象,知道如何實施與執行一個請求相關的操作。
 ?
 
源碼實現
 
#include "chef.h"class Command
{
public:Command(Chef* chef);virtual ~Command();virtual void ExcuteCmd();protected:Chef*   m_Chef;
};
 
class Chef
{
public:Chef();void KungPaoChicken();void FishFlavoredShreddedPork();void BigPlateChicken();
};
 
#include "chef.h"
#include <iostream>
Chef::Chef()
{}void Chef::KungPaoChicken()
{std::cout << "宮保雞丁" << std::endl;
}void Chef::FishFlavoredShreddedPork()
{std::cout << "魚香肉絲" << std::endl;
}void Chef::BigPlateChicken()
{std::cout << "大盤雞" << std::endl;
} 
#include "command.h"
#include "chef.h"class KungPaoChickenCmd : public Command
{
public:KungPaoChickenCmd(Chef* chef);void ExcuteCmd() override;
};
 
#include "kungpaochickencmd.h"KungPaoChickenCmd::KungPaoChickenCmd(Chef* chef):Command(chef)
{}void KungPaoChickenCmd::ExcuteCmd()
{m_Chef->KungPaoChicken();
}
 
#include <list>
#include <command.h>class Waiter
{
public:Waiter();void AddCmd(Command* cmd);void DelCmd(Command* cmd);void Nodify();
private:std::list<Command*>     m_CmdList;
};
 
#include "waiter.h"Waiter::Waiter()
{}void Waiter::AddCmd(Command *cmd)
{m_CmdList.push_back(cmd);
}void Waiter::DelCmd(Command *cmd)
{m_CmdList.remove(cmd);
}void Waiter::Nodify()
{for(auto cmd : m_CmdList){if(cmd)cmd->ExcuteCmd();}
}
 
#include <iostream>
#include "fishflavoredshreddedporkcmd.h"
#include "kungpaochickencmd.h"
#include "bigplatechickencmd.h"
#include "waiter.h"
#include <memory>
int main()
{std::shared_ptr<Chef> chef = std::make_shared<Chef>();Waiter waiter;std::shared_ptr<FishFlavoredShreddedPorkCmd> ffspc = std::make_shared<FishFlavoredShreddedPorkCmd>(chef);std::shared_ptr<KungPaoChickenCmd> kpcc = std::make_shared<KungPaoChickenCmd>(chef);std::shared_ptr<BigPlateChickenCmd> bpcc = std::make_shared<BigPlateChickenCmd>(chef);waiter.AddCmd(ffspc.get());waiter.AddCmd(kpcc.get());waiter.AddCmd(bpcc.get());//        waiter.DelCmd(kpcc.get);waiter.Nodify();return 0;
} 
 魚香肉絲
 宮保雞丁
 大盤雞
 
 
優點
 
命令模式的優點
 
- 它能較容易的設計一個命令隊列;
- 在需要的情況下,可以較容易的將命令計入日志;
- 允許接收請求的一方決定是否要否決請求;
- 可以容易的實現對請求的撤銷和重做;
- 由于加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易;
- 把請求一個操作的對象與知道怎么執行一個操作的對象分隔開;
缺點
 
模式的缺點
 
策略模式的區別
                            總結
                            
                                以上是生活随笔為你收集整理的命令模式(C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。