生活随笔
收集整理的這篇文章主要介紹了
命令模式(C++)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
命令模式
模式定義
命令模式可以對(duì)發(fā)送者和接收者完全解耦,發(fā)送者與接收者之間沒(méi)有直接引用關(guān)系,發(fā)送請(qǐng)求的對(duì)象只需要知道如何發(fā)送請(qǐng)求,而不必知道如何完成請(qǐng)求。
將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作。
模式動(dòng)機(jī)
- 敏捷開(kāi)發(fā)的原則告訴我們,不要為代碼添加基于猜測(cè)的、實(shí)際不需要的功能。如果不清楚一個(gè)系統(tǒng)是否需要命令模式,一般就不要著急去實(shí)現(xiàn)它,事實(shí)上,在需要的時(shí)候通過(guò)重構(gòu)實(shí)現(xiàn)這個(gè)模式并不困難,只有在真正需要如撤銷/恢復(fù)操作等功能時(shí),把原來(lái)的代碼重構(gòu)為命令模式才有意義。
UML類圖
參與者:
Command:聲明了用于執(zhí)行請(qǐng)求的execute()等方法,通過(guò)這些方法可以調(diào)用請(qǐng)求接收者的相關(guān)操作。
ConcreteCommand: 具體執(zhí)行的命令,將接收者對(duì)象的動(dòng)作綁定其中。
Invoker:命令的調(diào)用者即請(qǐng)求的發(fā)送者,要求該命令執(zhí)行請(qǐng)求。
Receiver:命令接受者,執(zhí)行命令的對(duì)象,知道如何實(shí)施與執(zhí)行一個(gè)請(qǐng)求相關(guān)的操作。
?
源碼實(shí)現(xiàn)
#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 << "魚(yú)香肉絲" << 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;
}
魚(yú)香肉絲
宮保雞丁
大盤雞
優(yōu)點(diǎn)
命令模式的優(yōu)點(diǎn)
- 它能較容易的設(shè)計(jì)一個(gè)命令隊(duì)列;
- 在需要的情況下,可以較容易的將命令計(jì)入日志;
- 允許接收請(qǐng)求的一方?jīng)Q定是否要否決請(qǐng)求;
- 可以容易的實(shí)現(xiàn)對(duì)請(qǐng)求的撤銷和重做;
- 由于加進(jìn)新的具體命令類不影響其他的類,因此增加新的具體命令類很容易;
- 把請(qǐng)求一個(gè)操作的對(duì)象與知道怎么執(zhí)行一個(gè)操作的對(duì)象分隔開(kāi);
缺點(diǎn)
模式的缺點(diǎn)
策略模式的區(qū)別
總結(jié)
以上是生活随笔為你收集整理的命令模式(C++)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。