#include <iostream> using namespace std; class reciver //执行者 { public: void action() { cout<< "reciver::action()"<<endl; } }; class command //命令 { public: command(reciver *rec):_rec(rec){} virtual ~command(){} virtual void execute() =0; protected: reciver *_rec; }; class concrete_command: public command { public: concrete_command(reciver *rec):command(rec){} void execute() { _rec->action(); } }; class invoker //派发命令者 { public: invoker(command *com):_com(com){} void execute_command() { _com->execute(); } void set_command(command *com) { _com = com; } private: command *_com; }; int main() { reciver *r = new reciver; command *c = new concrete_command(r); invoker *i = new invoker(c); i->execute_command(); delete i;delete c;delete r; return 0; } /////////////////////////////////////////////// #include <iostream> #include <vector> using namespace std; class barbecuer { public: void bake_mutton() { cout<< "bake mutton..."<<endl; } void bake_chicken_wing() { cout<< "bake chicken wing..."<<endl; } }; class command { public: command(barbecuer *rec):_rec(rec){} virtual ~command(){} virtual void execute() =0; protected: barbecuer *_rec; }; class bake_mutton_command : public command { public: bake_mutton_command(barbecuer *rec):command(rec){} void execute() { _rec->bake_mutton(); } }; class bake_chicken_wing_command : public command { public: bake_chicken_wing_command(barbecuer *rec):command(rec){} void execute() { _rec->bake_chicken_wing(); } }; class waiter { public: void add_order(command *com) { coms.push_back(com); } void cancel_order(command *com) { } void notify() { for (vector<command*>::iterator it = coms.begin(); it != coms.end(); ++it) (*it)->execute(); } private: vector<command *> coms; }; int main() { barbecuer *boy = new barbecuer(); command *bakeMutton1 = new bake_mutton_command(boy); command *bakeMutton2 = new bake_mutton_command(boy); command *bakeChickenWing = new bake_chicken_wing_command(boy); waiter girl; girl.add_order(bakeMutton1); girl.add_order(bakeMutton2); girl.add_order(bakeChickenWing); girl.notify(); delete boy; delete bakeChickenWing; delete bakeMutton1; delete bakeMutton2; return 0; }