2013年8月9日
摘要: 一. 访问者模式定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。结构如下:二. 举例假设有一项科学实验,是用来对比两种种子在不同环境下的生长情况。两种种子,一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B)。生长环境,分别是在多雨环境下(Rain_Status),阳光环境下(Sun_Status)等等。结构如下:代码如下:[cpp] view plaincopy//状态classStatus{public:virtual~Status(){}virtualvoidVisitSeed_A(Seed*elm){}vi 阅读全文
posted @ 2013-08-09 12:50 any91 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 一. 解释器模式定义:给定一个语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的句子。结构如下:代码如下:[cpp] view plaincopy//包含解释器之外的一些全局信息classContext{public:Context(){}~Context(){}};classAbstractExpression{public:virtual~AbstractExpression(){}virtualvoidInterpret(constContext&c){}protected:AbstractExpression(){}};//终结符表达式classT 阅读全文
posted @ 2013-08-09 12:48 any91 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 一. 举例说明我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构。Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样就避免暴露这个聚合对象的内部表示的可能。例如在 STL 里有如相下结构:二. 迭代器模式定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。比较经典的例子是 STL 里的 for_each 操作:[cpp] view plaincopy//functioncalledforeachelementvoidprint(intelem){coutcoll;INSERT 阅读全文
posted @ 2013-08-09 12:47 any91 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 一. 举例说明我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令。这里有几点需要说明:1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数。2. 用户并不需要知道别的用户的存在,也不管别人发不发命令,只管自己发命令,最后给结果即可。3. 这些命令先是到了一个消息队列里面,然后由消息队列调用库函数。结构图如下:代码如下:[cpp] view plaincopyclassCommand;//实施与执行类classReciever{public:voidAction(){cout_rev=rev;}~Read_Command(){deleteth 阅读全文
posted @ 2013-08-09 12:46 any91 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 一. 举例比如,现在中图和日本在关于钓鱼岛问题上存在争端。这时,联合国就会站出来,做为调解者,其实也没什么好调解的,钓鱼岛本来就是中国的,这是不争的事实!联合国也就是个传话者、发言人。结构图如下:代码如下:[cpp] view plaincopy//抽象国家classCountry{protected:Mediator*m_mediator;//中介public:virtualvoidSetMediator(Mediator*mediator){}//设置中介virtualvoidSendMessage(stringmessage){}//向中介发信息virtualvoidGetMessage 阅读全文
posted @ 2013-08-09 12:45 any91 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 一. 备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。结构图:使用范围:Memento 模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator 可以根据保存的 Memento 信息还原到前一状态。代码:[cpp] view plaincopy//备忘录类//负责存储Originator对象的内部状态classMemento{//注意:备忘录类中的方法是私有的!!!!!!!private://这是最关键的地方,将Originator为fri 阅读全文
posted @ 2013-08-09 12:42 any91 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 一. 举例一般汽车发动机工作时有四种状态,吸气、压缩、做功和排气。在运行时,不同的状态会有不同的行为,当前的状态机在适当的时候会过渡到下一状态。其实用户在使用时根本不知道当前的状态,也无需知道当前的状态。用户只需要给发动机一个初始状态,最后得到一个停止状态就行了。结构图如下:代码如下:[cpp] view plaincopy//状态classState{public:virtualvoidOperation(Work*work){}};//工作classWork{private:State*m_state;//目前状态intm_step;//步骤public:Work(State*state) 阅读全文
posted @ 2013-08-09 12:39 any91 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 一. 举例说明以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法。结构如下:Algorithm:抽象类,提供算法的公共接口。RSA_Algorithm:具体的RSA算法。DES_Algorithm:具体的DES算法。BASE64_Algorithm:具体的Base64算法。在使用过程中,我只需要对外公布Algorithm_Context这个类及接口即可。代码实现:[cpp] view plaincopy//策略类classAlgorithm{public:virtualvoidcalculate()=0;};//具体RSA算法classRSA_Alg 阅读全文
posted @ 2013-08-09 12:38 any91 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 一. 举例说明还以我以前做的文件系统(FileSys)为例:文件系统是一个独立的系统,它提供一套核心的文件操作。除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统(ZipFile),加密子系统(EncrypeFile)和刻录子系统(BurnCD),这四个子系统相互独立,但又可以做为主系统功能的一部分。假设客户需要我这个文件系统有两种执行模式,一种是完全模式,一种是简单模式。完全模式,要求杀毒子,压缩,加密和刻录功能都有。简单模式,要求只要有杀毒,刻录就行了。第一种设计:文件系统自己管理所有的子系统,并实现客户的需求。最开始的话,我们是按上面的结构来设计的,这个文件 阅读全文
posted @ 2013-08-09 12:37 any91 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 一. 举例说明我们有时打开一个网站时会发现有这样的现象,网站上的文字都显示出来了,但是上面的图片还没显示,要等一会才能显示。这些未打开的图片的位置上,还是会有图片框和一些等待的信息的,这就是代理模式的应用,此时的代理存储了真实图片的路径和尺寸也用来显示一些友好的信息。结构图如下:代码实现:[cpp] view plaincopy//基类classBigImage{public:BigImage(stringname):m_imageName(name){}virtual~BigImage(){}virtualvoidShow(){}protected:stringm_imageName;};/ 阅读全文
posted @ 2013-08-09 12:34 any91 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 一. 概述在面向对象系统的设计何实现中,创建对象是最为常见的操作。这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果没有为字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同),在这种情况我们可以为将对象的状态分为“外部状态”和“内部状态”,将可以被共享(不会变化)的状态作为内部状态存储在对象中,而外部对 阅读全文
posted @ 2013-08-09 12:34 any91 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 一. 举例这个例子是书上的,假设有一个公司的组结结构如下:它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点。而且最关健的是,它的每一层结构很相似。代码实现如下:[cpp] view plaincopy//公司类,提供接口classCompany{public:Company(stringname){m_name=name;}virtual~Company(){}virtualvoidAdd(Company*pCom){}virtualvoidDisplay(intdepth){}protected:stringm_name;};//具体公司classConcrete 阅读全文
posted @ 2013-08-09 12:33 any91 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 一. 举例我之前做过一个文件系统就叫 MyFileSys 吧,后来的话,客户想加入一些附加功能,比如压缩、加密、杀毒之类的操作,这些附加操作没有先后顺序,比如你可以先压缩再加密,也可以先杀毒再压缩,等等。这些附加功能是可选的,有的客户要这些功能,有的不要,有的要其中的几种附加功能等等。怎么设计呢?第一种方案:直接修改这个独立的文件系统 MyFileSys,对于不同的客户实现不同的文件系统。后来随着客户的增多,发现维护和修改的工作量越来越大。因为每增加一个客户就要重新生成一个类,然后把客户想要的附加功能加入,更加郁闷的是,只针对一个客户有时也是要修改很多次,客户今天要这些附加功能,明天又想加入另 阅读全文
posted @ 2013-08-09 12:30 any91 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 一. 举例N年前:计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP_Win系统也不能运行在IBM上。这时如果有一家新公司Apple出了一台新电脑,那么这个公司也要开发自己的系统 Apple_Win,Apple_Linux。其实,上面几家公司开发的软件和硬件在很多地方都有相似之处,如果每家公司都做自己的系统,这意味着资源和人员的极大浪费。这时,无论出现新的系统,还是出现新的公司,对这种设计模式的修改都是很大的。N年后:Windows出现了,Linux出现了,软件和硬件 阅读全文
posted @ 2013-08-09 12:26 any91 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 一. 概述定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。换句话说,就是不用重新初始化对象,而是动态地获得对象运行时的状态。再说明白点,就是要一个拷贝过构造函数类似功能的接口。结构图如下:代码如下:[cpp] view plaincopy//原型类,有一个clone接口classPrototype{public:virtual~Prototype(){}virtualPrototype*Clone()const=0;};//具体原型类,实现一个clone自身的操作classConcretePrototype:publicPrototype{public:ConcreteP 阅读全文
posted @ 2013-08-09 12:25 any91 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 一. 概述Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。二. 举例KFC 与 Mcdonalds 的汉堡生成过程大致都是一样的,假设分为4个步骤;但是 KFC 与 Mcdonalds 的汉堡味道有所差别,主要是在每一步的细节上有所不同。顾客要吃汉堡并不关心具体的生产步骤,其实汉堡店也不关心,因为数百年来,这些步骤者是相同的,差别只在细节上。比如盐 阅读全文
posted @ 2013-08-09 12:23 any91 阅读(286) 评论(0) 推荐(0) 编辑
摘要: 一. 定义适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。Adapter 模式的两种类别:类模式和对象模式。二. 举例说明实际中,我们为了完成某项工作购买了一个第三方的库来加快开发。这个库可能都是一些.dll文件,这就带来了一个问题!我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作了,Adapter模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口的方法。三. 代码实现类模式的Adapter采用继承的方式复用Adaptee的接口。[cpp 阅读全文
posted @ 2013-08-09 12:21 any91 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 一. 概述职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。二. 举个例子员工要求加薪公司的管理者一共有三级:总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。结构图如下:假设:经理可以处理薪水的范围在:0~500总监可以处理薪水的范围在:500~1000总经理可以处理薪水的范围在:10 阅读全文
posted @ 2013-08-09 12:17 any91 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 一. 概述Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。Sbuject 相当于通知者,它提供依赖于它的观察者Observer 的注册(Attach)和注销(Detach)操作,并且提供了使得依赖于它的所有观察者同步的操作(Notify)。Observer 相当于观察者,则提供一个Update操作,注意这里的 Observer 的 Update 操作并不在Observer 改变了Subject目标状态的时候就对自己进行更新,这个更新操作要延迟到 Subject 对象发出 Noti 阅读全文
posted @ 2013-08-09 12:16 any91 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。一. 简单工厂模式简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。举个例子,有一家电子产品生产厂家,它只有一个工厂,能够生产两种型号的产品,A 和 B。可以想像一下,A是电吹风,B是电风扇。客户需要什么样的吹风类产品,一定要显示地告诉生产工厂。代码实现:[cpp] view plaincopyenumCTYPE{PRODUCT_A,PRODUCT_B};//抽象产品类classProduct{public:virtualvoidShow()=0;};// 阅读全文
posted @ 2013-08-09 12:15 any91 阅读(342) 评论(0) 推荐(0) 编辑