设计模式学习--命令模式
来源:互联网 发布:java编程经验技巧 编辑:程序博客网 时间:2024/05/22 01:49
命令模式,将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销操作。
命令模式的作用
第一,它能较容易地设计一个命令队列;第二,在需要的情况下,可以较容易地将命令计入日志;第三,允许接收请求的一方决定是否要否决请求。第四,可以容易地实现对请求的撤销和重做;第五,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
命令模式把请求一个操作的对象与知道怎么执行一个操作对象分隔开。
#include <iostream>#include <list>#include <map>using namespace std;class BarbecurCooker//烧烤厨师类{public:void BakeMutton()//烤羊肉串{cout<<"烤羊肉串!"<<endl;}void BakeChickenWing()//烤鸡翅{cout<<"烤鸡翅!"<<endl;}};class AbstractCmd//命令抽象类{protected:BarbecurCooker* m_cooker;//指针指向厨师对象public:AbstractCmd(BarbecurCooker* cooker):m_cooker(cooker){};//传入厨师对象指针virtual void ExcuteCmd() = 0;//执行命令/*返回具体的命令内容 c#中有反射机制,c++没有。所以想办法由命令指针得到命令的具体内容*/virtual string returncmd() = 0;};class RealMuttonCmd : public AbstractCmd//具体的命令--烤羊肉串类{public:RealMuttonCmd(BarbecurCooker* cooker):AbstractCmd(cooker){};//传入厨师对象指针void ExcuteCmd()//执行命令{this->m_cooker->BakeMutton();}/*返回具体的命令内容 c#中有反射机制,c++没有。所以想办法由命令指针得到命令的具体内容*/string returncmd(){return "烤羊肉串";}};class RealChickenCmd : public AbstractCmd//具体的命令--烤鸡翅类{public:RealChickenCmd(BarbecurCooker* cooker):AbstractCmd(cooker){};//传入厨师对象指针void ExcuteCmd()//执行命令{this->m_cooker->BakeChickenWing();}/*返回具体的命令内容 c#中有反射机制,c++没有。所以想办法由命令指针得到命令的具体内容*/string returncmd(){return "烤鸡翅";}};char* nowtime()//时间函数 返回当前时间字符串指针{time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );return asctime (timeinfo);}class Waiter//服务员类{list<AbstractCmd*> order;//命令列表list<AbstractCmd*>::iterator it;//容器迭代器public:void setOrder(AbstractCmd* cmd)//添加命令{if(cmd->returncmd() == "烤鸡翅")//鸡翅没有了,通过传入的cmd判断具体是哪个命令{cout<<"服务员:鸡翅没有了,请点其他烧烤"<<endl;}else//添加命令并增加日志{order.push_back(cmd);cout<<"增加订单:"<<cmd->returncmd()<<"\t时间: "<<nowtime();}}void CancleOrder(AbstractCmd* cmd)//取消订单并增加日志{order.remove(cmd);cout<<"取消订单:"<<cmd->returncmd()<<"\t时间: "<<nowtime(); }void Notify()//遍历链表 执行命令{cout<<"\n请确认订单:"<<endl;for(it = order.begin(); it != order.end(); it++){(*it)->ExcuteCmd();}}};int main(){/*开餐前的准备*/BarbecurCooker* cooker = new BarbecurCooker();AbstractCmd* cmd1 = new RealMuttonCmd(cooker);AbstractCmd* cmd2 = new RealChickenCmd(cooker);Waiter* girl = new Waiter();/*客户下单*/girl->setOrder(cmd1);girl->setOrder(cmd2);girl->setOrder(cmd1);girl->setOrder(cmd1);girl->setOrder(cmd1);/*取消订单*/girl->CancleOrder(cmd2);/*执行订单*/girl->Notify();return 0;}
显示结果:
[hjf@hjf 设计模式]$ ./a.out
增加订单:烤羊肉串 时间: Thu Mar 16 15:51:33 2017
服务员:鸡翅没有了,请点其他烧烤
增加订单:烤羊肉串 时间: Thu Mar 16 15:51:33 2017
增加订单:烤羊肉串 时间: Thu Mar 16 15:51:33 2017
增加订单:烤羊肉串 时间: Thu Mar 16 15:51:33 2017
取消订单:烤鸡翅 时间: Thu Mar 16 15:51:33 2017
请确认订单:
烤羊肉串!
烤羊肉串!
烤羊肉串!
烤羊肉串!
0 0
- 设计模式学习--命令模式
- 设计模式学习-----命令模式
- 设计模式学习--命令模式
- 设计模式学习--命令模式
- 学习设计模式-命令模式
- 设计模式学习:命令模式
- 设计模式学习10 -- 命令模式
- 设计模式学习笔记之命令模式
- 设计模式学习--命令模式(command)
- <大话设计模式学习一>命令模式
- 设计模式学习总结(18) 命令模式
- 设计模式学习笔记之命令模式
- 设计模式学习笔记-命令模式
- 设计模式学习笔记--命令模式
- [设计模式学习笔记]命令模式
- 设计模式学习笔记—命令模式
- 学习笔记:Java设计模式-命令模式
- 学习笔记:java设计模式--命令模式
- PL/SQL中游标和游标变量的使用
- 身份认证,权限控制,导航数据,日志管理
- linux
- 大型敏捷框架SAFe的Portfolio层
- slf4j 与jul、log4j1、log4j2、logback的集成
- 设计模式学习--命令模式
- 使用 CSS3 实现超炫的 Loading(加载)动画效果以及cs3的在线制作工具
- 双态运维联盟首个“共研基地”落户云南电网信息中心
- 斐波那契堆
- Vue2.0 给Tab标签页和页面切换过渡添加样式
- Oracle数据库的安装详细步骤
- 图片等静态资源在登录前被拦截
- ERROR: Could not find a valid gem 'sass' (>= 0), here is why: Unable to download data from
- 微服务实战系列文章