命令模式
#命令模式
##一、UML图
二、概念
命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求进行排队或记录请求日志,以及支持可撤销的操作。
三、说明
角色:
(1)Command类:用来声明执行操作的接口。
(2)ConcreteCommand类:将一个接收者对象绑定与一个动作,调用接收者相应的操作,以实现Excute。
(3)Invoker类:要求该命令执行这个请求。
(4)Receiver类:知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。
命令模式的作用?
(1)命令模式能够较容易地设计一个命令队列。
(2)在需要的情况下,可以较容易地将命令记入日志。
(3)允许接收请求的一方决定是否要否决请求。
(4)可以容易地实现对请求的撤销和重做。
(5)由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
(6)命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开。
四、C++实现
(1)Command.h
//Receiver:此处为烤羊肉串者
class Barbecuer
{
public:
void BakeMutton()
{
std::cout<<"烤羊肉串!"<<std::endl;
}
void BakeChickenWing()
{
std::cout<<"烤鸡翅!"<<std::endl;
}
};
//Command类,抽象命令
class Command
{
protected:
Barbecuer* receiver;
public:
Command(Barbecuer* receiver)
{
this->receiver=receiver;
}
virtual void ExcuteCommand()=0;
};
//ConcreteCommand类,具体命令
class BakeMuttonCommand:public Command
{
public:
BakeMuttonCommand(Barbecuer* receiver):Command(receiver){}
void ExcuteCommand()
{
receiver->BakeMutton();
}
};
//ConcreteCommand类,具体命令
class BakeChickenWingCommand:public Command
{
public:
BakeChickenWingCommand(Barbecuer* receiver):Command(receiver){}
void ExcuteCommand()
{
receiver->BakeChickenWing();
}
};
//Invoker:此处为Waiter服务员
class Waiter
{
private:
std::vector<Command> orders;
public:
Waiter()
{
orders=new std::vector<Command>;
}
~Waiter()
{
delete orders;
}
//设置订单
void SetOrder(Command command)
{
//判断命令的类型并分别做不同的处理
if(typeid(command)==typeid(BakeChickenWingCommand))
{
std::cout<<"日志:服务员:鸡翅没有了,请点别的烧烤!"<<std::endl;
}
else if(typeid(command)==typeid(BakeMuttonCommand))
{
orders->push_back(command);
time_t now=time(0);
std::cout<<"日志:增加订单:命令模式.烤羊肉串 "<<"时间:"<<asctime(gmtime(&now));
}
else
{
std::cout<<"日志:暂时没有该服务!"<<std::endl;
}
}
//通知全部执行
void Notify()
{
std::vector<Command>::iterator it;
for(it=orders->begin();it!=orders->end();it++)
{
(it)->ExcuteCommand();
}
}
};
(2)Client.cpp
void main()
{
//开店前的准备
Barbecuer* boy=new Barbecuer();
Command* bakeMuttonCommand1=new BakeMuttonCommand(boy);
Command* bakeMuttonCommand2=new BakeMuttonCommand(boy);
Command* bakeChickenWingCommand1=new BakeChickenWingCommand(boy);
Waiter* girl=new Waiter();
//开门营业,顾客点菜
girl->SetOrder(bakeMuttonCommand1);
girl->SetOrder(bakeMuttonCommand2);
girl->SetOrder(bakeChickenWingCommand1);
//点菜完毕,通知厨房
girl->Notify();
delete boy,bakeMuttonCommand1,bakeMuttonCommand2,bakeChickenWingCommand1;
system("pause");
}
(3).运行截图