命令模式:将一个请求封装为一个对象,从而使你可用不同请求。对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。优点就是把一个请求操作的对象,和一个知道怎么一个操作的对象分隔开,不再是紧耦合。敏捷开发原则,不要为代码添加基于猜测的,实际不需要的功能。这也是编程中很重要的一个原则——KISS原则。
#pragma once
#include <stdio.h>
#include <list>
using std::list;
//最终处理命令者
class Barbecuer
{
public:
void bakemutton()
{
printf("烤肉串\n");
}
void bakechickenwing()
{
printf("烤鸡翅\n");
}
};
//命令类系
class Command
{
public:
Command(Barbecuer& cur)
{
this->m_cur = cur;
}
virtual void excutecommand(){ }
protected:
Barbecuer m_cur;
};
class BakeChickenWingCommand :public Command
{
public:
BakeChickenWingCommand(Barbecuer &cur) :Command(cur)
{
}
virtual void excutecommand()
{
m_cur.bakechickenwing();
}
};
class BakeMuttonCommand :public Command
{
public:
BakeMuttonCommand(Barbecuer &cur) :Command(cur)
{
}
virtual void excutecommand()
{
m_cur.bakemutton();
}
};
//管理命令类
class Waiter
{
public:
void addcommand(Command * com)
{
m_comlist.push_back(com);
}
void cancelcommand(Command* com)
{
m_comlist.remove(com); //每个命令都不同,使用remove胜过erase.
}
//通知执行
void notify()
{
for each (Command * var in m_comlist)
{
var->excutecommand();
}
}
private:
list<Command*> m_comlist;
};
int main()
{
Barbecuer boy;
Command * com1 = new BakeMuttonCommand(boy);
Command * com2 = new BakeMuttonCommand(boy);
Command * com3 = new BakeMuttonCommand(boy);
Command *com4 = new BakeChickenWingCommand(boy);
Waiter girl;
girl.addcommand(com1);
girl.addcommand(com2);
girl.addcommand(com3);
girl.addcommand(com4);
girl.notify();
printf("烤串太多,取消一个\n");
girl.cancelcommand(com3);
girl.notify();
return 0;
}