大话设计模式C++实现-第23章-命令模式
来源:互联网 发布:qq三国js四象搭配 编辑:程序博客网 时间:2024/05/16 12:42
一、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 <iostream>#include <string>#include <vector>#include <ctime>//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();}}};#endif
(2)Client.cpp
#include "Command.h"#include <iostream>#include <cstdlib>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)运行截图
0 0
- 大话设计模式C++实现-第23章-命令模式
- 《大话设计模式》--- 第23个:命令模式
- 大话设计模式C++实现-第16章-状态模式
- 大话设计模式C++实现-第2章-策略模式
- 大话设计模式C++实现-第6章-装饰模式
- 大话设计模式C++实现-第7章-代理模式
- 大话设计模式C++实现-第9章-原型模式
- 大话设计模式C++实现-第12章-外观模式
- 大话设计模式C++实现-第14章-观察者模式
- 大话设计模式C++实现-第17章-适配器模式
- 大话设计模式C++实现-第18章-备忘录模式
- 大话设计模式C++实现-第19章-组合模式
- 大话设计模式C++实现-第20章-迭代器模式
- 大话设计模式C++实现-第28章-访问者模式
- 大话设计模式C++实现-第7章-代理模式
- 大话设计模式--第23章 烤羊肉串引来的思考——命令模式
- 大话设计模式23----命令模式
- 大话设计-命令模式
- 蓝桥杯试题集 基础练习 杨辉三角形
- 安卓ExpandableListView实现多组列表,类似于QQ分组
- Linux内核网络协议栈代码分析
- 记录一下lampp配置域名目录的过程。
- AS3清空数组的三种方法
- 大话设计模式C++实现-第23章-命令模式
- apache 安装
- node.js的软肋 处理CPU密集型任务的解决方案
- SICP 习题 (2.31)解题总结 : 通用的Square-Tree
- netty复习整理
- Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作
- 第十七周项目六学生成绩统计(4)
- Unix C (九)
- 用MPMoviePlayerController播放视频的方法