一. 举例说明 我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令.这里有几点需要说明: 1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数. 2. 用户并不需要知道别的用户的存在,也不管别人发不发命令,只管自己发命令,最后给结果即可. 3. 这些命令先是到了一个消息队列里面,然后由消息队列调用库函数. 结构图如下: 代码如下: class Command; //实施与执行类 class Reciever { public: void Ac…
命令模式又称为行动(Action)模式或者交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销或恢复功能. 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象. 1.  结构 涉及的角色如下: 客户角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者. 命令(Command)角色:声明了一个给所有具体命令类的抽象接…
在生活中,我们装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或换气扇.在购买开关时,用户并不知道它将来到底用于控制什么电器,也就是说,开关与电灯.换气扇并无直接关系,一个开关在安装之后可能用来控制电灯,也可能用来控制换气扇或者其他电器设备.相同的开关可以通过不同的电线来控制不同的电器,如下图所示. 在软件开发中也存在很多与开关和电器类似的请求发送者和接受者对象,例如一个按钮,它可能是一个“关闭窗口”请求的发送者,而按钮点击事件处理类则是该请求的接受者.…
#写在前面 也了解了不少设计模式了,他们都有一个通病,那就是喜欢把简单的东西复杂化.比如在不同的类中加个第三者.哈哈哈,简单变复杂是有目的的,那就是降低耦合度,增强可维护性,提高代码复用性,使代码变得健壮. #小白入门--理解什么是命令模式 学校中.生活中.社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在.命令这一词也就在阶层中诞生.家长命令孩子,老师命令学生,领导命令小娄娄.这些都在我们的生活存在的东西,相信这一个模式学习起来也会比较简单的.这次我们就举一个领导命令员工的例子来学…
命令模式又称为行动(Action)模 式或交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中. 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象. 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作:接收的一方收到请求,并执行操作.命令模式允许 请求的一方和接收的一方独立开来,使 得 请 求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行.何时被执行,以及是怎么被执行的. 命令模式类图:…
一. 解释器模式 定义:给定一个语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的句子. 结构如下: 代码如下: //包含解释器之外的一些全局信息 class Context { public: Context() {} ~Context() {} }; class AbstractExpression { public: virtual ~AbstractExpression() {} virtual void Interpret(const Context& c…
一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP_Win系统也不能运行在IBM上. 这时如果有一家新公司Apple出了一台新电脑,那么这个公司也要开发自己的系统 Apple_Win,Apple_Linux. 其实,上面几家公司开发的软件和硬件在很多地方都有相似之处,如果每家公司都做自己的系统,这意味着资源和人员的极大浪费. 这时,无论出现新的系统…
一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环境下的生长情况. 两种种子,一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B). 生长环境,分别是在多雨环境下(Rain_Status),阳光环境下(Sun_Status)等等. 结构如下: 代码如下: //状态 class Status { public: virtual ~S…
一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样就避免暴露这个聚合对象的内部表示的可能. 例如在 STL 里有如相下结构: 二. 迭代器模式 定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 比较经典的例子是 STL 里的 for_each 操作: // function called for each…
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator 可以根据保存的 Memento 信息还原到前一状态. 代码: //备忘录类 //负责存储 Originator 对象的内部状态 class Memento { //注意:备忘录类中的方法是私…
一. 举例 一般汽车发动机工作时有四种状态,吸气.压缩.做功和排气. 在运行时,不同的状态会有不同的行为,当前的状态机在适当的时候会过渡到下一状态. 其实用户在使用时根本不知道当前的状态,也无需知道当前的状态.用户只需要给发动机一个初始状态,最后得到一个停止状态就行了. 结构图如下: 代码如下: //状态 class State { public: virtual void Operation(Work *work) {} }; //工作 class Work { private: State …
一. 举例说明 以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法. 结构如下: Algorithm:抽象类,提供算法的公共接口. RSA_Algorithm:具体的RSA算法. DES_Algorithm:具体的DES算法. BASE64_Algorithm:具体的Base64算法. 在使用过程中,我只需要对外公布Algorithm_Context这个类及接口即可. 代码实现: //策略类 class Algorithm { public: virt…
一. 举例说明 还以我以前做的文件系统(FileSys)为例: 文件系统是一个独立的系统,它提供一套核心的文件操作. 除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统(ZipFile),加密子系统(EncrypeFile)和刻录子系统(BurnCD),这四个子系统相互独立,但又可以做为主系统功能的一部分. 假设客户需要我这个文件系统有两种执行模式,一种是完全模式,一种是简单模式. 完全模式,要求杀毒子,压缩,加密和刻录功能都有. 简单模式,要求只要有杀毒,刻录就行…
一. 举例说明 我们有时打开一个网站时会发现有这样的现象,网站上的文字都显示出来了,但是上面的图片还没显示,要等一会才能显示. 这些未打开的图片的位置上,还是会有图片框和一些等待的信息的,这就是代理模式的应用,此时的代理存储了真实图片的路径和尺寸也用来显示一些友好的信息. 结构图如下: 代码实现: //基类 class BigImage { public: BigImage(string name): m_imageName(name) {} virtual ~BigImage() {} vir…
一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: //公司类,提供接口 class Company { public: Company(string name) { m_name = name; } virtual ~Company() {} virtual void Add(Company *pCom) {} virtual void Displa…
一. 举例 我之前做过一个文件系统就叫 MyFileSys 吧,后来的话,客户想加入一些附加功能,比如压缩.加密.杀毒之类的操作,这些附加操作没有先后顺序,比如你可以先压缩再加密,也可以先杀毒再压缩,等等. 这些附加功能是可选的,有的客户要这些功能,有的不要,有的要其中的几种附加功能等等.怎么设计呢? 第一种方案: 直接修改这个独立的文件系统 MyFileSys,对于不同的客户实现不同的文件系统. 后来随着客户的增多,发现维护和修改的工作量越来越大.因为每增加一个客户就要重新生成一个类,然后把客…
一. 概述 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 换句话说,就是不用重新初始化对象,而是动态地获得对象运行时的状态. 再说明白点,就是要一个拷贝过构造函数类似功能的接口. 结构图如下: 代码如下: //原型类,有一个clone接口 class Prototype { public: virtual ~Prototype() {} virtual Prototype* Clone() const = 0; }; //具体原型类,实现一个clone自身的操作 cla…
一. 概述 Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样. 二. 举例 KFC 与 Mcdonalds 的汉堡生成过程大致都是一样的,假设分为4个步骤: 但是 KFC 与 Mcdonalds 的汉堡味道有所差别,主要是在每一步的细节上有所不同.…
一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中,我们为了完成某项工作购买了一个第三方的库来加快开发.这个库可能都是一些.dll文件,这就带来了一个问题!我们在应用程序中已经设计好 了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作了,Adapter模式提供了将一个类(第三方库) 的接口转化为客户(购…
一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于通知者,它提供依赖于它的观察者Observer 的注册(Attach)和注销(Detach)操作,并且提供了使得依赖于它的所有观察者同步的操作(Notify). Observer 相当于观察者,则提供一个Update操作,注意这里的 Observer 的 Update 操作并不在Observer 改…
工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一. 简单工厂模式 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要修改工厂类.举个例子,有一家电子产品生产厂家,它只有一个工厂,能够生产两种型号的产品,A 和 B.可以想像一下,A是电吹风,B是电风扇.客户需要什么样的吹风类产品,一定要显示地告诉生产工厂. 代码实现: enum CTYPE {PRODUCT_A, PRODUCT_B}; //抽象产品类 class…
一. 问题 在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的.Template提供了这种情况的一个实现框架. 二. 模式 Template 模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节. 三. 代码 //抽象基类,实现了一个模板方法 class AbstractClass { public: virtual ~Abstra…
命令模式的意图 将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化: 对请求排队或记录请求日志,以及支持可撤销的操作: 命令模式告诉我们可以为一个操作生成一个对象并给出它的一个执行方法. 命令模式的构成 1.客户角色: 创建一个具体命令对象,并确定其接受者. 2.命令角色: 声明一个给所有具体命令类的抽象接口.这是一个抽象角色,通常由一个接口或抽象类实现. 3.具体命令角色: 定义一个接收者和行为之间的弱耦合,实现execute方法,负责调用接收者的相应操作. 4.请求者角色:…
一.概述 定义:命令(Command)模式又叫作动作(Action)模式或事务(Transaction)模式,是一种对象的行为模式.将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作.上面的定义有以下几个要点: 参数化配置客户的请求:比如对同一个请求者(Invoker),坐下.站起.奔跑三个Command,为Invoker配置不同的的Command,就会执行不同的功能 请求排队:可以将多个命令组成命令队列,然后依次取出命令对象来执行.…
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse. Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句…
一.引言   今天我们开始讲"行为型"设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command Pattern.还是老套路,先从名字上来看看."命令模式"我第一次看到这个名称,我的理解是,可能是一种行为或者一个操作就是一个命令."命令"这个词语在军队里面用的最多,比如:下达作战命令,接下来就是上战场玩命了.基于这些,我感觉"命令"就是任务,执行了…
一.引言 今天我们开始讲“行为型”设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command Pattern.还是老套路,先从名字上来看看.“命令模式”我第一次看到这个名称,我的理解是,可能是一种行为或者一个操作就是一个命令.“命令”这个词语在军队里面用的最多,比如:下达作战命令,接下来就是上战场玩命了.基于这些,我感觉“命令”就是任务,执行了命令就完成了一个任务.或者说,命令是任务,我们再从这个名字上并不知道命令的…
Command?? 把方法的调用用一个类的实例来承载,要管理工作的历史记录,创建这些方法执行的命令的集合,只需管理这些实例的集合即可,而且还可以随时再次执行过去的命令,或是将多个过去的命令整合为一个新命令并执行.称之为Command设计模式 那里合适使用: Command有时也被称为事件(event).它与"事件驱动编程"中的"事件"是一样的意思.当发生点击鼠标.按下键盘按键等事件时,我们可以先将这些事件作成实例,然后按照发生顺序放入队列中.接着,再依次去处理它们.…
State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊…
Command定义 将来自客户端的请求传入一个对象,无需了解这个请求激活的 动作或有关接受这个请求的处理细节. 这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能. 优点: 解耦了发送者和接受者之间联系. 发送者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,发送者无需知道接受者任何接口. 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装成在一个类…