上一页 1 ··· 7 8 9 10 11 12 下一页
  2013年8月9日
摘要: 一. 概述在面向对象系统的设计何实现中,创建对象是最为常见的操作。这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果没有为字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“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) 编辑
上一页 1 ··· 7 8 9 10 11 12 下一页