c++设计模式--命令模式

来源:互联网 发布:全球大数据公司排名 编辑:程序博客网 时间:2024/05/16 09:44

// CommandPattern.cpp : 定义控制台应用程序的入口点。
//通过此例程了解设计模式里的命令模式

//命令模式(Command)把请求封装成一个对象,使请求能够存储更多的信息拥有更多的能力。命令模式同样能够把请求的发送者和接收者解耦,但它不关心请求将以何种方式被处理。命令模式经常与职责链模式(Chain of Responsibility)和组合模式(Composite)一起使用:职责链模式处理命令模式封装的对象,组合模式可以把简单的命令对象组合成复杂的命令对象。
// GOOD:一、建立命令队列;二、可以将命令记入日志;三、接收请求的一方可以拒绝;四、添加一个新命令类不影响其它类;
// 命令模式把请求一个操作的对象与知道怎么操行一个操作的对象分开

 

RES:http://hi.baidu.com/xuehuo_0411/item/752af02bcc97080d42634ad0

 

 

 

#include "stdafx.h"#include <process.h>#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(); system("pause"); return 0;}


 

 

 

 

 


 

 

原创粉丝点击