设计模式:可复用面向对象软件的基础

设计模式

设计模式的书我听闻比较经典的有《设计模式:可复用面向对象软件的基础》、《Head first 设计模式》、《设计模式之禅》、《大话设计模式》、《Python编程实战:运用设计模式、并发和程序库创建高质量程序》。
前两本都看过,看的时候感觉都貌似理解了,当时也能在工作中运用一下。不过过个三五个月就发会现,这些知识又丢了。所以打算搞个便于记忆的摘要出来。没事拿出来翻翻下,勾起下记忆。主要是结构图,适应性,效果。基本上看结构图就能理解了。

我建议大家反复阅读《设计模式:可复用面向对象软件的基础》。其他书适合初学者阅读。
感觉这些模式在客户端开发中体现的比较多。在Web开发中较少。
拿Android来说,
View和ViewGroup其实就是composite模式。
在View和ViewGroup中的事件传递,就是CHAIN OF RESPONSIBILITY。
而Observer更是有现在的接口observer和observable

设计模式有4个基本要素

  1. 模式名称
  2. 问题:描述了应该在何时使用模式。
  3. 解决方案:描述了设计的组成部分,它们之间的相互关系及各自的职责和协作方式。
  4. 效果:描述了模式应用的效果及使用模式应权衡的问题。

23个设计模式

  1. Abstract Factory(抽象工厂):提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  2. Adapter(适配器):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  3. Bridge(桥接):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  4. Builder(生成器):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  5. Chain of Responsibility(职责链):为解除请求的发送者和接收者之间耦合,而使得多个对象都有机会处理这个对象。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
  6. Command(命令):将一个请求封闭为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作。
  7. Composite(组合):将对象组合成树形结构以表示"部分-整体"的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。
  8. Decorator(装饰器):动态地给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式比生成子类方式更为灵活。
  9. Facade(外观):为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更容易使用。
  10. Factory Method(工厂方法):定义一个用于创建对象的接口,让子类决定让哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
  11. Flyweight(享元):运用共享技术有效地支持大量细粒度的对象。
  12. Interpreter(解释器):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
  13. Iterator(迭代器):提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。
  14. Mediator(中介者):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  15. Memento(备忘):在不破坏封闭性的前提下,捕获一个对象的内部状态,并在该对象之外保存状态。这样以后就可以将该对象恢复到保存的状态。
  16. Observer(观察者):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
  17. Prototype(原型):用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
  18. Proxy(代理):为其他对象提供一个代理以控制对这个对象的访问。
  19. Singleton(单例):保证一个类仅有一个实例,并提供一个访问它的全局访问点。
  20. State(状态):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
  21. Strategy(策略):定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
  22. Template Method(模板方法):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  23. Visitor(访问者):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

设计模式分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3M3BIyTI-1667554561799)(http://7xr7gu.com1.z0.glb.clouddn.com/2017-01-03-14833524720547.jpg)]

我们根据两条准则(表1-1)对模式进行分 类。

目的准则

第一是目的准则,即模式是用来完成什么工作的。
模式依据其目的可分为创建型(Creational)、结构型(Structural)、或行为型(Behavioral)三种。
创建型模式与对象的创建有关;
结构型模式处理类或对象的组合;
行为型模式对类或对象怎样交互和怎样分配职责进行描述。

范围准则

第二是范围准则,指定模式主要是用于类还是用于对象
类模式处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来了。
对象模式处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性。从某种意义上来说,几乎所有模式 都使用继承机制,所以"类模式"只指那些集中于处理类间关系的模式,而大部分模式都属 于对象模式的范畴。

创建型类模式将对象的部分创建工作延迟到子类,而创建型对象模式则将它延迟到另一个对象中。
结构型类模式使用继承机制来组合类,而结构型对象模式则描述了对象的组装方式。
行为型类模式使用继承描述算法和控制流,而行为型对象模式则描述一组对象怎样协作以完成单个对象所无法完成的任务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PEqNqo5Z-1667554561800)(http://7xr7gu.com1.z0.glb.clouddn.com/2017-01-03-14833528226620.jpg)]

导致重新设计的一般原因,以及解决这些问题的设计模式举例

  1. 通过显式地指定一个类来创建对象 在创建对象时指定类名将使你受特定实现的约束 而不是特定接口的约束。这会使未来的变化更复杂。要避免这种情况,应该间接地创建对象。
    设计模式: AbstractFactory , FactoryMethod , Prototype 。

  2. 对特殊操作的依赖 当你为请求指定一个特殊的操作时,完成该请求的方式就固定下 来了。为避免把请求代码写死,你将可以在编译时刻或运行时刻很方便地改变响应请求的方 法。
    设计模式: ChainofResposibility , Command。

  3. 对硬件和软件平台的依赖外部的操作系统接口和应用编程接口(API)在不同的软硬件平台上是不同的。依赖于特定平台的软件将很难移植到其他平台上,甚至都很难跟上本地平 台的更新。所以设计系统时限制其平台相关性就很重要了。
    设计模式: AbstractFactory , Bridge。

  4. 对对象表示或实现的依赖 知道对象怎样表示、保存、定位或实现的客户在对象发生 变化时可能也需要变化。对客户隐藏这些信息能阻止连锁变化。
    设计模式: AbstractFactory , Bridge , Memento, Proxy

  5. 算法依赖 算法在开发和复用时常常被扩展、优化和替代。依赖于某个特定算法的对象在算法发生变化时不得不变化。因此有可能发生变化的算法应该被孤立起来。
    设计模式: Builder, Iterator, Strategy , TemplateMethod , Visitor

  6. 紧耦合 紧耦合的类很难独立地被复用,因为它们是互相依赖的。紧耦合产生单块的 系统,要改变或删掉一个类,你必须理解和改变其他许多类。这样的系统是一个很难学习、 移植和维护的密集体。松散耦合提高了一个类本身被复用的可能性,并且系统更易于学习、移植、修改和扩展。 设计模式使用抽象耦合和分层技术来提高系统的松散耦合性。
    设计模式: AbstractFactory , Command , Facade , Mediator , Observer ,Chainof Responsibility。

  7. 通过生成子类来扩充功能 通常很难通过定义子类来定制对象。每一个新类都有固定 的实现开销(初始化、终止处理等)。定义子类还需要对父类有深入的了解。如,重定义一个操 作可能需要重定义其他操作。一个被重定义的操作可能需要调用继承下来的操作。并且子类 方法会导致类爆炸,因为即使对于一个简单的扩充,你也不得不引入许多新的子类。一般的对象组合技术和具体的委托技术,是继承之外组合对象行为的另一种灵活方法。 新的功能可以通过以新的方式组合已有对象,而不是通过定义已存在类的子类的方式加到应 用中去。另一方面,过多使用对象组合会使设计难于理解。许多设计模式产生的设计中,你 可以定义一个子类,且将它的实例和已存在实例进行组合来引入定制的功能。
    设计模式: Bridge, ChainofResponsibility ,Composite , Decorator , Observer , Str ategy 。

  8. 不能方便地对类进行修改 有时你不得不改变一个难以修改的类。也许你需要源代码 而又没有 (对于商业类库就有这种情况 ),或者可能对类的任何改变会要求修改许多已存在的其 他子类。设计模式提供在这些情况下对类进行修改的方法。
    设计模式: Adapter , Decorator , Visitor 。

设计模式所支持的设计的可变方面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNd1dsQh-1667554561800)(http://7xr7gu.com1.z0.glb.clouddn.com/2017-01-05-14834218177272.jpg)]

设计模式背后的6大设计原则

  1. 单一职责原则: 一个类只能有一个修改原因,>1个原因 就说明需要提取出去。
  2. 里氏替换原则:能使用父类的地方,都能替换成子类。
  3. 依赖倒置原则:面向接口编程,而不是面向实现编程。就是要抽象,定标准。
  4. 接口隔离原则
  5. 开闭原则:面向修改封闭,面向扩展开放。就是新需求来了,不要改原来的实现,通过新增类来实现需求。这样影响最小。

创建型模式

创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那 些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委 托给另一个对象。

在这些模式中有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些具体的类 的信息封装起来。第二,它们隐藏了这些类的实例是如何被创建和放在一起的。

ABSTRACT FACTORY(抽象工厂)–对象创建型模式

  1. 意图
    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  2. 别名
    Kit

  3. 动机 略

  4. 适用性
    在以下情况下可以使用Abstract Factory模式

    • 一个系统要独立于它的产品的创建、组合和表示时。
    • 一个系统要由多个产品系列中的一个来配置时。
    • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
    • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
  5. 结构
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-roHpzDUg-1667554561801)(http://7xr7gu.com1.z0.glb.clouddn.com/2017-01-03-14833571344859.jpg)]

  6. 参与者 略

  7. 协作

    • 通常在运行时刻创建一个ConcreteFactory类的实例。这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂。
    • AbstractFactory将产品对象的创建延迟到它的ConcreteFactory子类。
  8. 效果
    AbstractFactory模式有下面的一些优点和缺点:

    1. 它分离了具体的类 Abstract Factory模式帮助你控制一个应用创建的对象的类。因为
      一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。
    2. 它使得易于交换产品系列 一个具体工厂类在一个应用中仅出现一次— 即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。
    3. 它有利于产品的一致性 当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而 AbstractFactory 很容易实现这一点。
    4. 难以支持新种类的产品 难以扩展抽象工厂以生产新种类的产品。这是因为
      AbstractFactory接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口,这将涉及A bstractFactory类及其所有子类的改变 。
  9. 实现 略

BUILDER(生成器)–对象创建型模式

  1. 意图 将一个复杂对象的构建与它的表示分离,使得现样的构建过程可以创建不同的表示。

  2. 动机 略

  3. 适应性
    在以下情况使用Builder模式

    • 在创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    • 当构造过程必须允许被构造的对象有不同的表示时。
  4. 结构
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fjqtKP24-1667554561802)(http://7xr7gu.com1.z0.glb.clouddn.com/2017-01-03-14833583785270.jpg)]

  5. 参与者 略

  6. 协作

  • 客户创建Director对象,并用它所想要的Builder对象进行配置。
  • 一旦产品部件被生成,导向器就会通知生成器。
  • 生成器处理导向器的请求,并将部件添加到该产品中。
  • 客户从生成品中检索产品。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y8VOV6TE-1667554561803)(http://7xr7gu.com1.z0.glb.clouddn.com/2017-01-03-14833585531301.jpg)]

  1. 效果
    这里是Builder模式的主要效果:
    1. 它使你可以改变一个产品的内部表示。Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。
  2. 它将构造代码和表示代码分开。Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息;这些类是不出现在Builder接口中的。每个Con creteBuilder包含了创建和装配一个特定产品的所有代码。 这些代码只需要写一次;然后不同的Dir ector可以复用它以在相同部件集合的基础上构作不同的Product。
  3. 它使你可对构造过程进行更精细的控制。Builder 模式 与 一下子就生成产品的创建型模式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器中取回它。因此Builder接 口相比其他创建型模式能更好的反映产品的构造过程。 这使你可以更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。
  4. 实现 略
  5. 代码示例 略
  6. 已知应用 略
  7. 相关模式
    Abstract Factory与Builder相似,因为它也可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个复杂对象。而Abstract Factory着重于多个系列的产品对象(简单的或是复杂的)。Builder在最后的一步返回产品,而对于Abstract Factory来说,产品是立即返回的。
    Composite通常是用Builder生成的。

FACTORY METHOD(工厂方法) --对象创建型模式

  1. 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

  2. 别名 虚构造器(Virtual Constructor)

  3. 动机 框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。

  4. 适用性
    在下列情况下可以使用Factory Method模式:

    1. 当一个类不知道它所必须创建的对象的类的时候。
    2. 当一个类希望由它的子类来指定它所创建的对象的时候。
    3. 当类将创建对象的职责委托给多个帮助子类中的一某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
  5. 结构
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0HJzaXl-1667554561803)(http://7xr7gu.com1.z0.glb.clouddn.com/2017-01-03-14834109567700.jpg)]

  6. 参与者

    • Product --定义工厂方法所创建的对象的接口
    • ContreteProduct–实现Product
    • Creator–声明工厂方法,该方法返回一个Product类型的对象;可以调用工厂方法以创建一个Product对象。
    • ConcreteCreator–重定义工厂方法以返回一个ConcreteProduct实例。
  7. 协作 Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。

  8. 效果
    工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接口;因此它可以与用户定义的任何Concret

基本信息 原书名: Design Patterns:Elements of Reusable Object-Oriented software 原出版社: Addison Wesley/Pearson 作者: (美)Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides [作译者介绍] 译者: 李英军 马晓星 蔡敏 刘建中 丛书名: 计算机科学丛书 出版社:机械工业出版社 ISBN:7111075757 上架时间:2005-7-19 出版日期:2004 年9月 开本:16开 页码:254 版次:1-11 内容简介   本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别有用。本书适合大学计算机专业的学生、研究生及相关人员参考。       [strong][font color="#ff0000"]书评[/font][/strong][font color="#ff0000"]       “这本众人期待的确达到了预期的全部效果。该书云集了经过时间考验的可用设计。作者从多年的面向对象设计经验中精选了23个模式,这构成了该书的精华部份,每一个精益求精的优秀程序员都应拥有这本《设计模式》。”--larry o'brien, software development       “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法可以作为后来者的榜样。如果要知道怎样恰当定义和描述设计模式,我们应该可以从他们那儿获得启发”--steve billow, journal of object-oriented programming       “总的来讲,这本书表达了一种极有价值的东西。对软件设计领域有着独特的贡献,因为它捕获了面向对象设计的有价值的经验,并且用简洁可复用的形式表达出来。它将成为我在寻找面向对象设计思想过程中经常翻阅的一本书﹕这正是复用的真实含义所在,不是吗﹖”--sanjiv gossain, journal of object-oriented programming [/font] 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 smalltalk mvc中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 .1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 compositor和composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 monoglyph 30 2.4.3 decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 abstract factory模式 35 2.6 支持多种窗口系统 35 2.6.1 我们是否可以使用abstract factory 模式 35 2.6.2 封装实现依赖关系 35 2.6.3 window和windowimp 37 2.6.4 bridge 模式 40 2.7 用户操作 40 2.7.1 封装一个请求 41 2.7.2 command 类及其子类 41 2.7.3 撤消和重做 42 2.7.4 命令历史记录 42 2.7.5 command 模式 44 2.8 拼写检查和断字处理 44 2.8.1 访问分散的信息 44 2.8.2 封装访问和遍历 45 2.8.3 iterator类及其子类 46 2.8.4 iterator模式 48 2.8.5 遍历和遍历过程中的动作 48 2.8.6 封装分析 48 2.8.7 visitor 类及其子类 51 2.8.8 visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 abstract factory(抽象工厂)— 对象创建型模式 57 3.2 builder(生成器)—对象创建型 模式 63 3.3 factory method(工厂方法)— 对象创建型模式 70 3.4 prototype(原型)—对象创建型 模式 87 3.5 singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 adapter(适配器)—类对象结构型 模式 92 4.2 bridge(桥接)—对象结构型 模式 100 4.3 composite(组成)—对象结构型 模式 107 4.4 decorator(装饰)—对象结构型 模式 115 4.5 facade(外观)—对象结构型 模式 121 4.6 flyweight(享元)—对象结构型 模式 128 4.7 proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 adapter与bridge 144 4.8.2 composite、decorator与proxy 145 第5章 行为模式 147 5.1 chain of responsibil ity(职责链) —对象行为型模式 147 5.2 command(命令)—对象行为型 模式 154 5.3 interpreter(解释器)—类行为型 模式 162 5.4 iterator(迭代器)—对象行为型 模式 171 5.5 mediator(中介者)—对象行为型 模式 181 5.6 memento(备忘录)—对象行为型 模式 188 5.7 observer(观察者)—对象行为型 模式 194 5.8 state(状态)—对象行为型模式 201 5.9 strategy(策略)—对象行为型 模式 208 5.10 template method(模板方法) —类行为型模式 214 5.11 visitor(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 5.12.4 对发送者和接收者解耦 229 5.12.5 总结 231 第6章 结论 232 6.1 设计模式将带来什么 232 6.2 一套通用的设计词汇 232 6.3 书写文档和学习的辅助手段 232 6.4 现有方法的一种补充 233 6.5 重构的目标 233 6.6 本书简史 234 6.7 模式界 235 6.8 alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录a 词汇表 238 附录b 图示符号指南 241 附录c 基本类 244 参考文献 249   前 言      本书并不是一本介绍面向对象技术或设计的书,目前已有不少好书介绍面向对象技术或设计。本书假设你至少已经比较熟悉一种面向对象编程语言,并且有一定的面向对象设计经验。当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的字典。      另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用软件而长时间进行的艰苦努力。设计模式捕获了这些解决方案,并用简洁易用的方式表达出来。      设计模式并不要求使用独特的语言特性,也不采用那些足以使你的朋友或老板大吃一惊的神奇的编程技巧。所有的模式均可以用标准的面向对象语言实现,这也许有时会比特殊的解法多费一些功夫,但是为了增加软件的灵活性和可复用性,多做些工作是值得的。      一旦你理解了设计模式并且有了一种“Aha!”(而不是“Huh?”)的应用经验和体验后,你将用一种非同寻常的方式思考面向对象设计。你将拥有一种深刻的洞察力,以帮助你设计出更加灵活的、模块化的、可复用的和易理解的软件—这也是你为何着迷于面向对象技术的源动力,不是吗?      当然还有一些提示和鼓励:第一次阅读此书时你可能不会完全理解它,但不必着急,我们在起初编写这本书时也没有完全理解它们!请记住,这不是一本读完一遍就可以束之高阁的书。我们希望你在软件设计过程中反复参阅此书,以获取设计灵感。      我们并不认为这组设计模式是完整的和一成不变的,它只是我们目前对设计的思考的记录。因此我们欢迎广大读者的批评与指正,无论从书中采用的实例、参考,还是我们遗漏的已知应用,或应该包含的设计模式等方面。你可以通过Addison-Wesley写信给我们,或发送电子邮件到:design-patterns@cs.uiuc.edu。你还可以发送邮件“send design pattern source”到design-patterns-source@cs.uiuc.edu获取书中的示例代码部分的源代码。      另外我们有一个专门的网页报道最新的消息与更新:      http://st-www.cs.uiuc.edu/users/patterns/DPBook/DPBook.html.      E.G. 于加州Mountain View    .  R.H. 于蒙特利尔      R.J. 于伊利诺Urbana      J.V. 于纽约 Hawthorne      1994年8月    序言    所有结构良好的面向对象软件体系结构中都包含了许多模式。实际上,当我评估一个面向对象系统的质量时,所使用的方法之一就是要判断系统的设计者是否强调了对象之间的公共协同关系。在系统开发阶段强调这种机制的优势在于,它能使所生成的系统体系结构更加精巧、简洁和易于理解,其程度远远超过了未使用模式的体系结构。    模式在构造复杂系统时的重要性早已在其他领域中被认可。特别地,Christopher Alexander和他的同事们可能最先将模式语言(pattern language)应用于城市建筑领域,他的思想和其他人的贡献已经根植于面向对象软件界。简而言之,软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。    在本书中,Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides介绍了设计模式的原理,并且对这些设计模式进行了分类描述。因此,该书做出了两个重要的贡献:首先,它展示了模式在建造复杂系统过程中所处的角色;其次,它为如何引用一组精心设计的模式提供了一个实用方法,以帮助实际开发者针对特定应用问题使用适当的模式进行设计。    我曾荣幸地有机会与本书的部分作者一同进行体系结构设计工作,从他们身上我学到了许多东西,并相信通过阅读该书你同样也会受益匪浅。    Rational 软件公司首席科学家 Grady Booch
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

资深web全栈开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值