/*命令模式,将一个请求封装为一个对象,从而可以用不同的请求进行参数化,
对请求排队或者记录请求日志,以及支持可撤销操作。*/
#include<iostream>
#include<string>
#include<time.h>
#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;
virtual string returncmd() = 0;
};
class RealMuttonCmd :public AbstractCmd
{
public:
RealMuttonCmd(BarbecurCooker* cooker) :AbstractCmd(cooker) {};
void ExcuteCmd()
{
this->m_cooker->BakeMutton();
}
string returncmd()
{
return "烤羊肉串";
}
};
class RealChicckenCmd :public AbstractCmd
{
public:
RealChicckenCmd(BarbecurCooker *cooker) :AbstractCmd(cooker) {};
void ExcuteCmd()
{
this->m_cooker->BakeChickenWing();
}
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() == "烤鸡翅")
{
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 RealChicckenCmd(cooker);
AbstractCmd *cmd2 = new RealMuttonCmd(cooker);
Waiter* girl = new Waiter();
girl->setOrder(cmd2);
girl->setOrder(cmd1);
girl->setOrder(cmd2);
girl->setOrder(cmd2);
girl->setOrder(cmd2);
girl->CancleOrder(cmd1);
girl->Notify();
system("pause");
return 0;
}
运行结果为:
增加订单:烤羊肉串 时间:Sun Sep 2 14:34:30 2018
服务员,鸡翅没有了,庆典其他烧烤
增加订单:烤羊肉串 时间:Sun Sep 2 14:34:30 2018
增加订单:烤羊肉串 时间:Sun Sep 2 14:34:30 2018
增加订单:烤羊肉串 时间:Sun Sep 2 14:34:30 2018
取消订单:烤鸡翅 时间:Sun Sep 2 14:34:30 2018
请确认订单:
考羊肉串!
考羊肉串!
考羊肉串!
考羊肉串!
请按任意键继续. . .
忽然感觉到设计模式太牛逼了