刚刚看了一遍关于命令模式的博文, 这里简单实现一下。
命令模式实际上就是把请求一个操作的对象与实际知道怎么操行一个操作的对象分开
现实生活中有很多这样的场景。 如下小例:
代码如下:
#include <iostream>
using namespace std;
#include <vector>
/*
场景需求分析: 去烧烤店吃烧烤
烤肉师傅(Barbucer): 会烤羊肉 会烤鸡翅 会烤...
服务员(Waiter): 接收 客户 的点菜指令 告诉烤肉师傅要烤什么 烤肉师傅执行指令
类似场景可以用命令模式分析:
class Barbucer: 有方法: 烤肉 烤鸡翅等
class Waiter: 有方法: 接收客户的指令(有命令列表)并告诉烤肉师傅(保存烤肉师傅对象指针)执行(其实是烤肉师傅接收命令执行)
客户发送命令, 有不同的命令,抽象出命令抽象类 具体实现如下
*/
//烤肉师傅类
class Barbucer
{
public:
void MakeMutton(){ cout<<"烤肉师傅开始烤羊肉..."<<endl;}
void MakeChickenWing(){ cout<<"烤肉师傅开始烤鸡翅..."<<endl;}
};
//命令的抽象类
class Command
{
public:
Command(Barbucer *temp){ receiver = temp; }
virtual void ExecuteCmd() = 0;
protected:
Barbucer *receiver;
};
class MakeMuttonCmd:public Command
{
public:
MakeMuttonCmd(Barbucer *temp):Command(temp){} //注意这里 显示的调用父类的有参构造函数来构造自己
virtual void ExecuteCmd(){
receiver->MakeMutton();
}
};
class MakeChickenWingCmd:public Command
{
public:
MakeChickenWingCmd(Barbucer *temp):Command(temp){}
virtual void ExecuteCmd(){
receiver->MakeChickenWing();
}
};
//服务员类
class Waiter
{
public:
void setCmd(Command *temp){
cmd_list.push_back(temp);
cout<<"服务员接到点菜命令..."<<endl;
}
void notify()
{
cout<<"服务员发送命令给烤肉师傅..."<<endl;
vector<Command*>::iterator iter = cmd_list.begin();
for(; iter != cmd_list.end(); ++iter){
(*iter)->ExecuteCmd();
}
}
protected:
vector<Command*> cmd_list;
};
int main(void)
{
//实例化出一个烤肉师傅
Barbucer *barbucer = new Barbucer;
//实例化处一个服务员
Waiter *waiter = new Waiter;
Command *makemuttoncmd = new MakeMuttonCmd(barbucer); //烤羊肉命令
Command *makechickenwingcmd = new MakeChickenWingCmd(barbucer); //烤鸡翅命令
//服务员接收到命令
waiter->setCmd(makemuttoncmd);
waiter->setCmd(makechickenwingcmd);
//服务员发送命令
waiter->notify();
return 0;
}
运行结果: