命令模式(Command)把请求封装成一个对象,使请求能够存储更多的信息拥有更多的能力。命令模式同样能够把请求的发送者和接收者解耦,但它不关心请求将以何种方式被处理。命令模式经常与职责链模式(Chain of Responsibility)和组合模式(Composite)一起使用:职责链模式处理命令模式封装的对象,组合模式可以把简单的命令对象组合成复杂的命令对象。
本文举了一个在饭店点菜的例子。(1)烤肉师傅负责在后台(厨房)做饭。(2)Command负责提供提供各种命令,相当于菜单。(3)服务员与客服打交道,负责记录客户点了哪些菜(把客户的命令记下来),然后交给厨师去做。(4)客户就负责点菜。
代码:
#include#include #include using namespace std; class Command; class MakeChikenCmd; class MakeMuttonCmd; //烤肉师傅 class RoastCook{ friend class MakeChikenCmd; friend class MakeMuttonCmd; private: void MakeMutton() { cout << "烤羊肉"; } void MakeChickenWing() { cout << "烤鸡翅膀"; } }; //命令的接口,抽象类 class Command{ public: Command(RoastCook* cook) { cooker = cook; } virtual ~Command(){} virtual void Execute()=0; protected: RoastCook *cooker;//包含了烤肉师傅的对象 }; //烤羊肉命令 class MakeMuttonCmd : public Command{ public: MakeMuttonCmd(RoastCook *cook):Command(cook){} void Execute() { cooker->MakeMutton(); } }; //烤鸡肉命令 class MakeChikenCmd : public Command{ public: MakeChikenCmd(RoastCook *cook):Command(cook){} void Execute() { cooker->MakeChickenWing(); } }; //服务员类,负责与客服交互 class Waiter{ public: Waiter(string _name) {this->name = _name;} void AddOder(Command* subOder)//加入客户点的菜 { oder.push_back(subOder); } void Notify() { vector ::iterator iter; cout< Execute(); cout< oder;//点菜单 string name;//服务员名字 }; class Custmer{ public: Custmer(string myname) { this->name = myname; this->w = NULL; } void CustmerOder(Command *cmd) { cout<<"顾客"< AddOder(cmd); } void CallWaiter(Waiter *_w) { cout<<"顾客"< w = _w; cout<<"服务员"< getName()<<"为您服务"< #include #include using namespace std; class Command; class MakeChikenCmd; class MakeMuttonCmd; //烤肉师傅 class RoastCook{ friend class MakeChikenCmd; friend class MakeMuttonCmd; private: void MakeMutton() { cout << "烤羊肉"; } void MakeChickenWing() { cout << "烤鸡翅膀"; } }; //命令的接口,抽象类 class Command{ public: Command(RoastCook* cook) { cooker = cook; } virtual ~Command(){} virtual void Execute()=0; protected: RoastCook *cooker;//包含了烤肉师傅的对象 }; //烤羊肉命令 class MakeMuttonCmd : public Command{ public: MakeMuttonCmd(RoastCook *cook):Command(cook){} void Execute() { cooker->MakeMutton(); } }; //烤鸡肉命令 class MakeChikenCmd : public Command{ public: MakeChikenCmd(RoastCook *cook):Command(cook){} void Execute() { cooker->MakeChickenWing(); } }; //服务员类,负责与客服交互 class Waiter{ public: Waiter(string _name) {this->name = _name;} void AddOder(Command* subOder)//加入客户点的菜 { oder.push_back(subOder); } void Notify() { vector ::iterator iter; cout< Execute(); cout< oder;//点菜单 string name;//服务员名字 }; class Custmer{ public: Custmer(string myname) { this->name = myname; this->w = NULL; } void CustmerOder(Command *cmd) { cout<<"顾客"< AddOder(cmd); } void CallWaiter(Waiter *_w) { cout<<"顾客"< w = _w; cout<<"服务员"< getName()<<"为您服务"<