#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;
}