命令模式
注意:关于UML图的讲解。
依赖:命令类依赖烤肉串者类;需要在命令抽象接口类加入烤肉串者的成员变量或者是在成员函数中作为输入参数;
class Barbecuer
{
public:
void bakeMutton()
{
cout<<"烤羊肉串"<<endl;
}
void bakeChickenWing()
{
cout<<"烤鸡翅"<<endl;
}
};
class Command
{
protected:
Barbecuer *receiver;
public:
Command(Barbecuer *receiver)
{
this->receiver=receiver;
}
virtual void executeCommand()=0;
};
聚合关系:一系列命令聚合在服务员类中;需要在服务员类中加入命令的成员变量;
class Waiter
{
private:
Command *command;
public:
void setOrder(Command *command)
{
this->command=command;
}
void notify()
{
command->executeCommand();
}
};
1. 命令模式:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。
2. 命令模式:
Command类,用来声明执行操作的接口。
Invoker类,要求该命令执行这个请求。---------服务员;
Recever类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。---------烤肉串者;
3. 命令模式的例子:
#include <iostream>
#include <string>
#include <list>
using namespace std;
class Barbecuer
{
public:
void bakeMutton()
{
cout<<"烤羊肉串"<<endl;
}
void bakeChickenWing()
{
cout<<"烤鸡翅"<<endl;
}
};
class Command
{
protected:
Barbecuer *receiver;
public:
Command(Barbecuer *receiver)
{
this->receiver=receiver;
}
virtual void executeCommand()=0;
};
class BakeMuttonCommand:public Command
{
public:
BakeMuttonCommand(Barbecuer *receiver):Command(receiver)
{}
void executeCommand()
{
receiver->bakeMutton();
}
};
class BakeChikenWingCommand:public Command
{
public:
BakeChikenWingCommand(Barbecuer *receiver):Command(receiver)
{}
void executeCommand()
{
receiver->bakeChickenWing();
}
};
class Waiter
{
private:
Command *command;
public:
void setOrder(Command *command)
{
this->command=command;
}
void notify()
{
command->executeCommand();
}
};
class Waiter2
{
private:
list<Command*> orders;
public:
void setOrder(Command *command)
{
orders.push_back(command);
}
void cancelOrder(Command *command)
{}
void notify()
{
list<Command*>::iterator iter=orders.begin();
while(iter!=orders.end())
{
(*iter)->executeCommand();
iter++;
}
}
};
int main()
{
Barbecuer *boy=new Barbecuer();
Command *bm1=new BakeMuttonCommand(boy);
Command *bm2=new BakeMuttonCommand(boy);
Command *bc1=new BakeChikenWingCommand(boy);
Waiter2 *girl=new Waiter2();
girl->setOrder(bm1);
girl->setOrder(bm2);
girl->setOrder(bc1);
girl->notify();
/*
Barbecuer *boy=new Barbecuer();
Command *bm1=new BakeMuttonCommand(boy);
Command *bm2=new BakeMuttonCommand(boy);
Command *bc1=new BakeChikenWingCommand(boy);
Waiter *girl=new Waiter();
girl->setOrder(bm1);
girl->notify();
girl->setOrder(bm2);
girl->notify();
girl->setOrder(bc1);
girl->notify();
*/
return 0;
}