设计模式学习--命令模式

来源:互联网 发布: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 胃病胀肚子很鼓怎么办 小孩淋巴结发炎肚子疼痛怎么办 顺产后子宫脱垂怎么办 顺产完子宫脱垂怎么办 额头长了个鱼鳞怎么办 脸上长了很多痣怎么办 做过狐臭的疤痕怎么办 痤疮留下的红印怎么办 脸上疤掉了黑印怎么办 脸上有黑色的疤怎么办 一只眼睛外斜视怎么办 残币银行不给换怎么办 手上有多套房的怎么办 长了两层脚指甲怎么办 指甲长了两层怎么办 脚趾甲长了两层怎么办 产妇气血虚没奶怎么办 哺乳期气血不足奶水少怎么办 刚怀孕喝了啤酒怎么办 受风怎么办最快最有效 孕妇后背受风了怎么办 肩膀和后背受风怎么办 手指关节杵肿了怎么办 骨关节退行性变怎么办 疼风脚趾肿了怎么办 痛风脚右侧肿了怎么办 痛风引起的脚肿怎么办 老人腰闪了该怎么办 腰闪了站不起来怎么办 又怕冷又爱上火怎么办 肝上多发小囊肿怎么办 5岁宝宝咳嗽厉害怎么办 5岁宝宝咳嗽有痰怎么办 生川乌外贴中毒怎么办 7个月宝宝流鼻涕怎么办 脸上皮肤毛孔粗大有黑头怎么办 嗓子长了个囊肿怎么办 食管胃粘膜异位怎么办 狗狗肿瘤破了怎么办 婴儿胃食道反流怎么办 小儿胃食道反流怎么办