
设计模式
lwbeyond
这个作者很懒,什么都没留下…
展开
-
聚合,组合,依赖
1. 聚合:是关联关系的一种特例,体现的是整体与部分拥有的关系,即 has-a 的关系,此时整体与部分之间可以分离。//学校class School{};//学生class Student{private: School* ps;};可以看到 Student 类中包含了一个 School 类的对象指针,而且在创建一个Student 类对象时一定要对指针进行原创 2012-03-30 17:25:58 · 1463 阅读 · 0 评论 -
设计模式C++描述----13.代理(Proxy)模式
一. 举例说明我们有时打开一个网站时会发现有这样的现象,网站上的文字都显示出来了,但是上面的图片还没显示,要等一会才能显示。这些未打开的图片的位置上,还是会有图片框和一些等待的信息的,这就是代理模式的应用,此时的代理存储了真实图片的路径和尺寸也用来显示一些友好的信息。结构图如下:代码实现://基类class BigImage{public: BigImag原创 2012-05-11 12:37:08 · 2455 阅读 · 0 评论 -
设计模式C++描述----14.外观(Facade)模式
一. 举例说明还以我以前做的文件系统(FileSys)为例:文件系统是一个独立的系统,它提供一套核心的文件操作。除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统(ZipFile),加密子系统(EncrypeFile)和刻录子系统(BurnCD),这四个子系统相互独立,但又可以做为主系统功能的一部分。假设客户需要我这个文件系统有两种执行模式,一种是完全原创 2012-05-14 11:22:22 · 2616 阅读 · 1 评论 -
设计模式C++描述----15.策略(Strategy)模式
一. 举例说明以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法。结构如下:Algorithm:抽象类,提供算法的公共接口。RSA_Algorithm:具体的RSA算法。DES_Algorithm:具体的DES算法。BASE64_Algorithm:具体的Base64算法。在使用过程中,我只需要对外公布Algori原创 2012-05-14 14:05:23 · 1937 阅读 · 0 评论 -
设计模式C++描述----16.状态(State)模式
一. 举例一般汽车发动机工作时有四种状态,吸气、压缩、做功和排气。在运行时,不同的状态会有不同的行为,当前的状态机在适当的时候会过渡到下一状态。其实用户在使用时根本不知道当前的状态,也无需知道当前的状态。用户只需要给发动机一个初始状态,最后得到一个停止状态就行了。结构图如下:代码如下://状态class State{public: virtual vo原创 2012-05-16 13:38:26 · 5607 阅读 · 0 评论 -
设计模式C++描述----17.备忘录(Memento)模式
一. 备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。结构图:使用范围:Memento 模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator 可以根据保存的 Memento 信息还原到前一状态。代码://备忘原创 2012-05-16 15:07:08 · 1523 阅读 · 0 评论 -
设计模式C++描述----19.命令(Command)模式
一. 举例说明我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令。这里有几点需要说明:1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数。2. 用户并不需要知道别的用户的存在,也不管别人发不发命令,只管自己发命令,最后给结果即可。3. 这些命令先是到了一个消息队列里面,然后由消息队列调用库函数。结构图如下:原创 2012-05-17 18:16:46 · 2336 阅读 · 0 评论 -
设计模式C++描述----20.迭代器(Iterator)模式
一. 举例说明我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构。Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样就避免暴露这个聚合对象的内部表示的可能。例如在 STL 里有如相下结构:二. 迭代器模式定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表原创 2012-05-21 11:05:33 · 1778 阅读 · 0 评论 -
设计模式C++描述----22.访问者(Visitor)模式
一. 访问者模式定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。结构如下:二. 举例假设有一项科学实验,是用来对比两种种子在不同环境下的生长情况。两种种子,一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B)。生长环境,分别是在多雨环境下(Rain_Status),阳光环境下(Sun_S原创 2012-05-21 14:33:57 · 2570 阅读 · 0 评论 -
设计模式的几种原则
一. 里氏代换原则定义:子类型必须能够替换它们的父类型。[DH]解释:也就是说,在软件里面,把父类都替换成子类,程序的行为没有变化。也只有这样父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。这个原则是对继承的一个约束,也就是说,继承中子类严格满足"is-a"的关系。所以,当你看到一个继承的时候,要习惯性的把他的父类和子类看成一个整体,这样会有助于你去理解各个类之原创 2012-04-28 16:02:12 · 1523 阅读 · 0 评论 -
设计模式C++描述----12.享元(Flyweight)模式
一. 概述在面向对象系统的设计何实现中,创建对象是最为常见的操作。这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果没有为字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000次,而实际上我们可以让这一万个字母“a”共享一原创 2012-05-10 15:56:02 · 2118 阅读 · 0 评论 -
设计模式C++描述----11.组合(Composite)模式
一. 举例这个例子是书上的,假设有一个公司的组结结构如下:它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点。而且最关健的是,它的每一层结构很相似。代码实现如下://公司类,提供接口class Company { public: Company(string name) { m_name =原创 2012-05-10 12:19:13 · 2069 阅读 · 1 评论 -
设计模式C++描述----10.装饰(Decorator)模式
一. 举例我之前做过一个文件系统就叫 MyFileSys 吧,后来的话,客户想加入一些附加功能,比如压缩、加密、杀毒之类的操作,这些附加操作没有先后顺序,比如你可以先压缩再加密,也可以先杀毒再压缩,等等。这些附加功能是可选的,有的客户要这些功能,有的不要,有的要其中的几种附加功能等等。怎么设计呢?第一种方案:直接修改这个独立的文件系统 MyFileSys,对于不同的客户实现不同的文原创 2012-05-09 16:29:27 · 1968 阅读 · 0 评论 -
常用 UML 类图
一. 类类图分三层:第一层是类的名称,如果是抽象类,则用斜体显示。第二层是类的特性,通常就是字段和属性。第三层是类的操作,通常是方法或行为。注意 '+' 表示 public,'-' 表示 private,'#' 表示 protected 。class Animal{public: void eat(); void birth();public: bool li原创 2012-04-27 11:53:05 · 2169 阅读 · 0 评论 -
设计模式C++描述----02.模板(Template)模式
一. 问题在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。Template提供了这种情况的一个实现框架。二. 模式Template 模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节。三. 代码原创 2012-04-27 16:01:02 · 2341 阅读 · 0 评论 -
设计模式C++描述----07.建造者(Builder)模式
一. 概述Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。二. 举例KFC 与 Mcdonalds 的汉堡生成过程大致都是一样的,假设原创 2012-05-07 17:02:48 · 2855 阅读 · 1 评论 -
设计模式C++描述----08.原型(Prototype)模式
一. 概述定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。换句话说,就是不用重新初始化对象,而是动态地获得对象运行时的状态。再说明白点,就是要一个拷贝过构造函数类似功能的接口。结构图如下:代码如下://原型类,有一个clone接口class Prototype{public: virtual ~Prototype() {}原创 2012-05-08 11:40:05 · 1613 阅读 · 1 评论 -
设计模式C++描述----09.桥接(Bridge)模式
一. 举例N年前:计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP_Win系统也不能运行在IBM上。这时如果有一家新公司Apple出了一台新电脑,那么这个公司也要开发自己的系统 Apple_Win,Apple_Linux。其实,上面几家公司开发的原创 2012-05-08 15:26:43 · 4308 阅读 · 0 评论 -
设计模式C++描述----04.观察者(Observer)模式
一. 概述Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。Sbuject 相当于通知者,它提供依赖于它的观察者Observer 的注册(Attach)和注销(Detach)操作,并且提供了使得依赖于它的所有观察者同步的操作(Notify)。Observer 相当于原创 2012-05-03 18:08:18 · 3120 阅读 · 0 评论 -
设计模式C++描述----05.职责链(Chain of Responsibility)模式
一. 概述职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。二. 举个例子员工要求加薪公司的管理者一共有三级:总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,原创 2012-05-07 11:45:03 · 1956 阅读 · 1 评论 -
设计模式C++描述----06.适配器(Adapter)模式
一. 定义适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。Adapter 模式的两种类别:类模式和对象模式。二. 举例说明实际中,我们为了完成某项工作购买了一个第三方的库来加快开发。这个库可能都是一些.dll文件,这就带来了一个问题!我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些接口不原创 2012-05-07 14:21:12 · 1593 阅读 · 0 评论 -
设计模式C++描述----01.单例(Singleton)模式
一.概念单例模式:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。class CSingleton{//公有的静态方法,来获取该实例public:static CSingleton* GetInstance(){ if ( m_pInstance == NULL ) //判断是否第一次调用 m_pInsta原创 2012-03-30 17:48:20 · 1957 阅读 · 1 评论 -
设计模式C++描述----03.工厂(Factory)模式
工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。一. 简单工厂模式简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。举个例子,有一家电子产品生产厂家,它只有一个工厂,能够生产两种型号的产品,A 和 B。可以想像一下,A是电吹风,B是电风扇。客户需要什么样的吹风类产品,一定要显示地告诉生产工厂。原创 2012-05-02 15:49:35 · 2355 阅读 · 1 评论 -
设计模式C++描述----21.解释器(Iterpreter)模式
一. 解释器模式定义:给定一个语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的句子。结构如下:代码如下://包含解释器之外的一些全局信息class Context { public: Context() {} ~Context() {}};class AbstractExpression { public:原创 2012-05-21 12:23:15 · 1788 阅读 · 0 评论