大话设计模式C++实现-第23章-命令模式

2015-01-24 05:33:52 · 作者: · 浏览: 3

一、UML图

\

?

二、概念

命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求进行排队或记录请求日志,以及支持可撤销的操作。

?

三、说明

角色:

(1)Command类:用来声明执行操作的接口。

(2)ConcreteCommand类:将一个接收者对象绑定与一个动作,调用接收者相应的操作,以实现Excute。

(3)Invoker类:要求该命令执行这个请求。

(4)Receiver类:知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。

命令模式的作用?

(1)命令模式能够较容易地设计一个命令队列。

(2)在需要的情况下,可以较容易地将命令记入日志。

(3)允许接收请求的一方决定是否要否决请求。

(4)可以容易地实现对请求的撤销和重做。

(5)由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。

(6)命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开。

?

四、C++实现

(1)Command.h

?

#ifndef COMMAND_H
#define COMMAND_H

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       //Receiver:此处为烤羊肉串者 class Barbecuer { public: void BakeMutton() { std::cout<<"烤羊肉串!"<
      
       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
       
         *orders; public: Waiter() { orders=new std::vector
        
         ; } ~Waiter() { delete orders; } //设置订单 void SetOrder(Command* command) { //判断命令的类型并分别做不同的处理 if(typeid(*command)==typeid(BakeChickenWingCommand)) { std::cout<<"日志:服务员:鸡翅没有了,请点别的烧烤!"<
         
          push_back(command); time_t now=time(0); std::cout<<"日志:增加订单:命令模式.烤羊肉串 "<<"时间:"<
          
           ::iterator it; for(it=orders->begin();it!=orders->end();it++) { (*it)->ExcuteCommand(); } } }; #endif
          
         
        
       
      
     
    
   
  


?

?

(2)Client.cpp

?

#include "Command.h"
#include 
  
   
#include 
   
     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)运行截图

\

上一篇http://www.2cto.com/kf/201412/364153.html