我们去烧烤摊吃烧烤,我们是通过服务员来点菜,具体是谁来做和他们什么时候完成,其实我们都不知道。抽象之,“菜单请求者”我们和“菜单实现者”烧烤师傅,2者之间是松耦合的,我们对这些菜的其他一些请求比如“撤销,重做”等,我们也不知道是谁在做。其实这就是本文要说的Command模式。
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
#include <iostream>
#include <vector>
using namespace std;
// 命令接受者 Receive
class SktMaster
{
public:
// 烤肉
void BakeMeats()
{
cout << "bake meats" << endl;
}
// 烤蔬菜
void BakeVegetables()
{
cout << "bake vegetables" << endl;
}
// 烤海鲜
void BakeSeafoods()
{
cout << "bake seafoods" << endl;
}
};
// 抽象命令类
class AbstractCommand
{
public:
// 执行命令
virtual void execute_command() = 0;
};
// 具体命令类: 烤肉
class BakeMeatsCommand : public AbstractCommand
{
public:
BakeMeatsCommand(SktMaster* skt)
{
this->skt_master = skt;
}
~BakeMeatsCommand()
{
delete skt_master;
}
void execute_command()
{
this->skt_master->BakeMeats();
}
private:
SktMaster* skt_master;
};
// 具体命令类: 烤蔬菜
class BakeVegetablesCommand : public AbstractCommand
{
public:
BakeVegetablesCommand(SktMaster* skt)
{
this->skt_master = skt;
}
~BakeVegetablesCommand()
{
delete skt_master;
}
void execute_command()
{
this->skt_master->BakeVegetables();
}
private:
SktMaster* skt_master;
};
// 具体命令类: 烤海鲜
class BakeSeafoods : public AbstractCommand
{
public:
BakeSeafoods(SktMaster* skt)
{
this->skt_master = skt;
}
~BakeSeafoods()
{
delete skt_master;
}
void execute_command()
{
this->skt_master->BakeSeafoods();
}
private:
SktMaster* skt_master;
};
// 服务员类 Invoker
class Waiter
{
public:
// 命令入队列
void set_order(AbstractCommand* command)
{
pCommandList.push_back(command);
}
// 通知执行命令
void notify()
{
vector<AbstractCommand*>::iterator it;
for (it = pCommandList.begin(); it != pCommandList.end(); ++it)
{
(*it)->execute_command();
}
}
private:
// 命令队列
vector<AbstractCommand*> pCommandList;
};
void test_01()
{
// 生成烧烤师傅、服务员和订单对象
SktMaster* skt = new SktMaster;
AbstractCommand* bake_meat = new BakeMeatsCommand(skt);
AbstractCommand* bake_vegetable = new BakeVegetablesCommand(skt);
AbstractCommand* bake_seafood = new BakeSeafoods(skt);
Waiter* waiter = new Waiter;
// 将订单对象推送到命令队列
waiter->set_order(bake_meat);
waiter->set_order(bake_vegetable);
waiter->set_order(bake_seafood);
// 服务员通知烧烤师傅具体订单
waiter->notify();
// 对象内存释放
delete skt;
delete bake_meat;
delete bake_vegetable;
delete bake_seafood;
delete waiter;
}
int main()
{
test_01();
system("pause");
return 0;
}