您的位置:首页 > 其它

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

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



命令模式的作用

  第一,它能较容易地设计一个命令队列;第二,在需要的情况下,可以较容易地将命令计入日志;第三,允许接收请求的一方决定是否要否决请求。第四,可以容易地实现对请求的撤销和重做;第五,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。

  命令模式把请求一个操作的对象与知道怎么执行一个操作对象分隔开。

#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

请确认订单:
烤羊肉串!
烤羊肉串!
烤羊肉串!
烤羊肉串!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: