您的位置:首页 > 编程语言 > C语言/C++

设计模式 --> 命令模式(C++实现)

2013-03-04 23:19 495 查看
/*
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
命令模式(Command)把请求封装成一个对象,使请求能够存储更多的信息拥有更多的能力。
命令模式把请求一个操作的对象与知道怎么操行一个操作的对象分开.
*/

#include <iostream>
#include <vector>
using namespace std;

// 烤肉师傅
class RoastCook
{
public:
void MakeMutton() { cout << "烤羊肉" << endl; }
void MakeChickenWing() { cout << "烤鸡翅膀" << endl; }
};

// 抽象命令类
class Command
{
public:
Command(RoastCook* temp) { receiver = temp; }
virtual void ExecuteCmd() = 0;

protected:
RoastCook* receiver;
};

// 烤羊肉命令
class MakeMuttonCmd : public Command
{
public:
MakeMuttonCmd(RoastCook* temp) : Command(temp) {}
virtual void ExecuteCmd() { receiver->MakeMutton(); }
};

// 烤鸡翅膀命令
class MakeChickenWingCmd : public Command
{
public:
MakeChickenWingCmd(RoastCook* temp) : Command(temp) {}
virtual void ExecuteCmd() { receiver->MakeChickenWing(); }
};

// 服务员类
class Waiter
{
public:
void SetCmd(Command* temp);

// 通知执行
void Notify();

protected:
vector<Command*> m_commandList;
};

void Waiter::SetCmd(Command* temp)
{
m_commandList.push_back(temp);
cout << "增加订单" << endl;
}

void Waiter::Notify()
{
vector<Command*>::iterator it;
for (it=m_commandList.begin(); it!=m_commandList.end(); ++it)
{
(*it)->ExecuteCmd();
}
}

int main()
{
// 店里添加烤肉师傅、菜单、服务员等顾客
RoastCook* cook = new RoastCook();
Command* cmd1 = new MakeMuttonCmd(cook);
Command* cmd2 = new MakeChickenWingCmd(cook);
Waiter* girl = new Waiter();

// 点菜
girl->SetCmd(cmd1);
girl->SetCmd(cmd2);

// 服务员通知
girl->Notify();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: