设计模式C++描述----19.命令(Command)模式
一. 举例说明
我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令。这里有几点需要说明:
1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数。
2. 用户并不需要知道别的用户的存在,也不管别人发不发命令,只管自己发命令,最后给结果即可。
3. 这些命令先是到了一个消息队列里面,然后由消息队列调用库函数。
结构图如下:

代码如下:
- class Command;
- //实施与执行类
- class Reciever
- {
- public:
- void Action()
- {
- cout<<"Do action !!"<<endl;
- }
- };
- //抽象命令类
- class Command
- {
- public:
- virtual ~Command() {}
- virtual void Excute() = 0;
- protected:
- Command() {}
- };
- //Read 命令
- class Read_Command:public Command
- {
- public:
- Read_Command(Reciever* rev)
- {
- this->_rev = rev;
- }
- ~Read_Command()
- {
- delete this->_rev;
- }
- void Excute()
- {
- cout<<"Read Command..."<<endl;
- _rev->Action();
- }
- private:
- Reciever* _rev;
- };
- //Write 命令
- class Write_Command:public Command
- {
- public:
- Write_Command(Reciever* rev)
- {
- this->_rev = rev;
- }
- ~Write_Command()
- {
- delete this->_rev;
- }
- void Excute()
- {
- cout<<"Write_Command..."<<endl;
- _rev->Action();
- }
- private:
- Reciever* _rev;
- };
- //要求命令执行的类
- class Invoker
- {
- public:
- Invoker(Command* cmd)
- {
- _cmd = cmd;
- }
- Invoker()
- {
- }
- ~Invoker()
- {
- delete _cmd;
- }
- //通知执行类执行
- void Notify()
- {
- list<Command*>::iterator it = cmdList.begin();
- for (it; it != cmdList.end(); ++it)
- {
- _cmd = *it;
- _cmd->Excute();
- }
- }
- //添加命令
- void AddCmd(Command* pcmd)
- {
- cmdList.push_back(pcmd);
- }
- //删除命令
- void DelCmd(Command* pcmd)
- {
- cmdList.remove(pcmd);
- }
- private:
- Command* _cmd;
- list<Command*> cmdList;
- };
- //测试代码
- int main(int argc,char* argv[])
- {
- Reciever* rev = new Reciever(); //定义一个执行类
- Command* cmd1 = new Read_Command(rev);//Read 命令
- Command* cmd2 = new Write_Command(rev);//Write 命令
- Invoker inv; //管理所有命令
- inv.AddCmd(cmd1);
- inv.AddCmd(cmd2);
- inv.Notify(); //通知执行类,执行
- inv.DelCmd(cmd1);
- inv.Notify();
- return 0;
- }
二. 命令模式
定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户时行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

优点:
1. 它能比较容易地设计一个命令队列。
2. 在需要的情况下,可以较容易地将命令记入日志。
3. 允许接收请求的一方决定是否要否决请求。
4. 可以容易地实现对请求的撤销和重做。
5. 增加新的具体命令类很容易
6. 把请求一个操作的对象(Command)与知道怎么执行一个操作的对象(Receiver)分割开来。
设计模式C++描述----19.命令(Command)模式的更多相关文章
- 命令(Command)模式
命令模式又称为行动(Action)模式或者交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可 ...
- 设计模式的征途—19.命令(Command)模式
在生活中,我们装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或换气扇.在购买开关时,用户并不知道它将来到底用于控制什么电器,也就是说,开关与电灯.换气扇并无 ...
- python 设计模式之命令(Command)模式
#写在前面 也了解了不少设计模式了,他们都有一个通病,那就是喜欢把简单的东西复杂化.比如在不同的类中加个第三者.哈哈哈,简单变复杂是有目的的,那就是降低耦合度,增强可维护性,提高代码复用性,使代码变得 ...
- 十五、命令(Command)模式--行为型模式(Behavioral Pattern)
命令模式又称为行动(Action)模 式或交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中. 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派 ...
- 设计模式C++描述----21.解释器(Iterpreter)模式
一. 解释器模式 定义:给定一个语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的句子. 结构如下: 代码如下: //包含解释器之外的一些全局信息 class Conte ...
- 设计模式C++描述----09.桥接(Bridge)模式
一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...
- 设计模式C++描述----22.访问者(Visitor)模式
一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...
- 设计模式C++描述----20.迭代器(Iterator)模式
一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...
- 设计模式C++描述----17.备忘录(Memento)模式
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...
随机推荐
- 证明xcosx无周期
假设\(xcos\,x\)有周期,依据周期函数的规律,可得 \[ \begin{aligned} xcos\,x & = (x+T)cos\,(x+T) \\ & = (x+T)cos ...
- Redis系列---操作命令及数据类型
本章将简单介绍下,Redis里面常用的数据类型以及我们常用到的一些命令,let's go 准备环境: Redis 详细见上一个章节 我们接下来操作的命令用的是Redis自带的客户端工具,在安装red ...
- 实现一个图片轮播-3d播放效果
前言:最近在做一个音乐播放器,首页要做一个图片轮播,看了bootstrap的carousel插件以及移动端的swipe.js库,都是平面图片轮播的效果,所以自己想着实现类似网易云app里那种3d图片轮 ...
- 防御 DDoS 的终极奥义——又拍云 SCDN
现如今不论是年轻的 80.90 后,还是 70.60 后,都在享受互联网带来的舒适和便利.在家就可以"逛商场",完全不受时间的限制:在线支付既方便又安全:业余娱乐项目多种多样,打农 ...
- Spark 学习笔记之 共享变量
共享变量: 共享变量通常情况下,当向Spark操作(如map,reduce)传递一个函数时,它会在一个远程集群节点上执行,它会使用函数中所有变量的副本.这些变量被复制到所有的机器上,远程机器上并没有被 ...
- redis系列之------简单的动态字符串(SDS)
前言 Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的 ...
- Xadmin查询
目录 深浅coopy运用 ModelForm的补充 提取模型当中相关属性 getattr和get_field的区别 __ str__,get_field,getattr初识 str ,当用getatt ...
- JavaScript事件属性event.target和currentTarget 属性的区别。
event.target 获取的是触发事件的标签元素 event.currentTarget 获取到的是发起事件的标签元素 一.事件属性:event.target target事件委托的定义:本来该自 ...
- 运维自动化神器ansible之user模块
运维自动化神器ansible之user模块 一.概述 user模块 可管理远程主机上的 用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 二.参数介绍 name: 用于指定操作 ...
- homebrew安装问题(Failed during: git fetch origin master:refs/remotes/origin/master --tags --force)
在mac系统中,使用homebrew可以很方便的管理包.按照官网的说明执行以下命令时总是报错: /usr/bin/ruby -e "$(curl -fsSL https://raw.gith ...