设计模式:23 烤羊肉串引来的思考_命令模式

来源:互联网 发布:宝黛爱情知乎 编辑:程序博客网 时间:2024/04/29 22:40

对于请求排队或记录请求日志,以及支持可撤销的操作等行为时,行为请求者与行为实现者的紧耦合不太合适。

用一个服务员来解耦客户和烤肉师傅的处理好处真的是很多。

 

命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。对请求排队或记录请求日志,以及支持可撤销的操作。

Command:用来声明类的接口

ConcreteCommand:将一个接受者对象绑定于一个动作,调用接收者相应的操作,以实现Execute

Invoker:要求该命令执行这个请求

Receiver:知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。

 

 

命令模式的作用:

1设计命令队列

2将命令记入日志

3允许接收请求的一方决定是否要否决请求

4实现对请求的撤销和重做

5由于加进新的具体命令类不影响其他的泪,因此增加新的具体命令类很容易

关键优点:

把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

 

敏捷开发原则:

不要为代码添加基于猜测的的功能,在需要的时候通过重构实现这个模式

 

main.cpp

#include <iostream>#include <stdlib.h>#include <memory>#include "Barbecuer.h"#include "Waiter.h"#include "Command.h"using namespace std;void process(){//开店前的准备std::shared_ptr<Barbecuer> ptrBarbecuer(new Barbecuer());std::shared_ptr<Command> ptrBakeMutton1(new BakeMuttonCommand(ptrBarbecuer));std::shared_ptr<Command> ptrBakeMutton2(new BakeMuttonCommand(ptrBarbecuer));std::shared_ptr<Command> ptrBakeChicken(new BakeChickenWingCommand(ptrBarbecuer));Waiter waiter;//开门营业waiter.setOrder(ptrBakeMutton1);//waiter.notify();waiter.setOrder(ptrBakeMutton2);//waiter.notify();waiter.setOrder(ptrBakeChicken);waiter.notify();}int main(int argc,char* argv[]){process();system("pause");return 0;}


Barbecuer.h

#ifndef BARBECUER_H#define BARBECUER_Hclass Barbecuer{public:Barbecuer(void);~Barbecuer(void);void bakeButton();void bakeChickenWing();};#endif


Barbecuer.cpp

#include "Barbecuer.h"#include <iostream>using namespace std;Barbecuer::Barbecuer(void){}Barbecuer::~Barbecuer(void){}void Barbecuer::bakeButton(){cout << "烤羊肉串" << endl;}void Barbecuer::bakeChickenWing(){cout << "烤鸡翅" << endl;}


Waiter.h

#ifndef WAITER_H#define WAITER_H#include <memory>#include <vector>#include "Command.h"class Waiter{public:Waiter(void);~Waiter(void);void setOrder(std::shared_ptr<Command> ptrCommand);void notify();void cancelOrder(int iNum);private:std::shared_ptr<Command> _ptrCommand;std::vector< std::shared_ptr<Command> > _vecPtrCommand;};#endif

 

Waiter.cpp

#include "Waiter.h"Waiter::Waiter(void){}Waiter::~Waiter(void){}//设置订单,注意,命令应该全部存入到容器中,void Waiter::setOrder(std::shared_ptr<Command> ptrCommand){//_ptrCommand = ptrCommand;_vecPtrCommand.push_back(ptrCommand);}//通知执行,遍历容器中的命令,全部执行void Waiter::notify(){//_ptrCommand->executeCommand();for(unsigned i = 0  ; i < _vecPtrCommand.size() ; i++){_vecPtrCommand.at(i)->executeCommand(); }}//取消订单void Waiter::cancelOrder(int iNum){if(_vecPtrCommand.size() > iNum){_vecPtrCommand.at(iNum) = NULL;}}


Command.h

#ifndef COMMAND_H#define COMMAND_H#include <memory>#include "Barbecuer.h"class Command{public:Command(std::shared_ptr<Barbecuer> ptrReciver);virtual ~Command(void);virtual void executeCommand() = 0;protected:std::shared_ptr<Barbecuer> _ptrReciver;//命令接受者,实际上是真正的命令执行者};//烤羊肉串命令class BakeMuttonCommand : public Command{public:BakeMuttonCommand(std::shared_ptr<Barbecuer> ptrReciver);~BakeMuttonCommand();void executeCommand();};//烤鸡翅命令class BakeChickenWingCommand : public Command{public:BakeChickenWingCommand(std::shared_ptr<Barbecuer> ptrReciver);~BakeChickenWingCommand();void executeCommand();};#endif


Command.cpp

#include "Command.h"Command::Command(std::shared_ptr<Barbecuer> ptrReciver):_ptrReciver(ptrReciver){}Command::~Command(void){}BakeMuttonCommand::BakeMuttonCommand(std::shared_ptr<Barbecuer> ptrReciver):Command(ptrReciver){}BakeMuttonCommand::~BakeMuttonCommand(){}void BakeMuttonCommand::executeCommand(){_ptrReciver->bakeButton();}BakeChickenWingCommand::BakeChickenWingCommand(std::shared_ptr<Barbecuer> ptrReciver):Command(ptrReciver){}BakeChickenWingCommand::~BakeChickenWingCommand(){}void BakeChickenWingCommand::executeCommand(){_ptrReciver->bakeChickenWing();}



 

0 0
原创粉丝点击