`

《设计模式》读书笔记——设计模式相关

 
阅读更多

读《设计模式——可复用面向对象软件的基础》时候做的笔记。下面的文字及图表基本上是该书的内容。

什么是设计模式

一个设计模式有4个基本要素:

模式名称(pattern name)一个帮助记忆的词汇。用一两个词来描述模式的问题、解决方案和效果。设计模式允许我们在较高的抽象层次上进行设计。

问题(problem)描述了应该在什么时候或者什么情况下使用该模式。它解释了设计问题和问题存在的前因后果,它可能描述了特点的设计问题,也可能描述了导致不灵活设计的类或对象结构。

解决方案(solution)描述了设计的组成成分,它们之间的相互关系以及各自的职责和协助方式。

效果(consequences)描述了模式应用的效果及使用模式应权衡的问题。它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显示地列出这些效果对理解和评价这些模式很有帮助。

设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。

一个设计模式命名、抽象和确定了一个通用设计结构的主要方面,这些设计结构能被用来构造可复用的面向对象设计。设计模式确定了所包含的类和实例,它们的角色、协作方式以及职责分配。每一个设计模式都集中于一个特定的面向对象设计问题或设计要点,描述了什么时候使用它,在另一些设计约束条件下是否还能使用,以及使用的效果和如何取舍。


23种设计模式的基本意图

抽象工厂(Abstract Factory)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

适配器(Adapter)将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

桥接(Bridge)将抽象部分与它的实现部分分离,使他们都可以独立地变化。

生成器(Builder)将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

职责链(Chain ofResponsibility) 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象练成一条链,并沿用这条链传递该请求,直到有一个对象处理它。

命令(Command)将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

组成(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对每个对象和复合对象的使用具有一致性。

装饰(Decorator)动态地给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式比生成子类的方式更为灵活。

外观(Facade)为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

工厂方法(Factory Method)定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

享元(Flyweight)运用共享技术有效地支持大量细粒度的对象。

解释器(Interpreter)给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用文法表示来解释语言中的句子。

迭代器(Iterator)提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。

中介者(Mediator)用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

备忘录(Memento)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

观察者(Observer)定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

原型(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

代理(Proxy)为其他对象提供一个代理以控制对这个对象的访问。

单例(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。

状态(State)允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

策略(Strategy)定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

模板方法(Template Method)定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

发问者(Visitor)表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用余这些元素的新操作。


设计模式的分类

目的

范围

创建型

结构型

行为型

Factory Method

Adapter(类)

Interpreter

Template Method

对象

Abstract Factory

Builder

Prototype

Singleton

Adapter(对象)

Bridge

Composite

Decorator

Façade

Flyweight

Proxy

Chain of Responsibility

Command

Iterator

Mediator

Mementor

Observer

State

Strategy

Visitor

以上的分类是根据两条准则进行的。

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

第二是范围准则,指定模式主要是用于类还是用于对象。类模式处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来。对象模式处理对象间的关系,这些关系在运行时刻是变化的,更具动态性。

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


设计模式之间的关系



相关问题的设计模式解决方案

可复用的面向对象设计有以下原则:

针对接口编程,而不是针对实现编程;

优先使用对象组合,而不是类继承

下面阐述了一些导致重新设计的一般原因,以及解决这些问题的设计模式:

1) 通过显式地指定一个类来创建对象

在创建对象时指定类名将使你受特定实现类约束而不是受特定接口约束。这会使未来的变化更复杂。要避免这种情况,应该间接地创建对象。

设计模式:Abstract Factory,FactoryMethod,Prototype

2) 对特殊操作的依赖

当你为请求指定一个特殊的操作时,完成该请求的方式就固定下来。为避免把请求代码写死,你将可以在编译时刻或运行时刻很方便地响应请求的方法。

设计模式:Chain of Responsibility,Command

3) 对硬件和软件平台的依赖

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

设计模式:Abstract Factory,Bridge

4) 对对象表示或实现的依赖

知道对象怎样表示、保存、定位或实现的客户在对象发生变化时可能也需要变化。对客户隐藏这些信息能阻止连锁变化。

设计模式:Abstract Factory,Bridge,Memento,Proxy

5) 算法依赖

算法在开发和复用时常常被扩展、优化和替代。依赖于某个特定算法的对象在算法发生变化时不得不变化。因此有可能发生变化的算法应该孤立起来。

设计模式:Builder,Iterator,Strategy,TemplateMethod,Visitor

6) 紧耦合

紧耦合的类很难独立地被复用,因为它们是互相依赖的。紧耦合产生单块的系统,要改变或删掉一个类,你必须理解和改变其他许多类。这样的系统是一个很难学习、移植和维护的密集体。

松耦合提高了一个类本身被复用的可能性,并且系统更易于学习、移植、修改和扩展。设计模式使用抽象耦合和分层技术来提高系统的松耦合性。

设计模式:Abstract Factory,Command,Façade,Mediator,Observer,

Chain of Responsibility

7) 通过生成子类来扩充功能

通常很难通过定义子类来定制对象。每一个新类都有固定的实现开销(初始化、终止处理等)。定义子类还需要对父类有深入的了解。如,重定义一个方法可能需要重定义其他方法。一个被重定义的方法可能需要调用继承下了的方法。并且子类方法会导致类爆炸,因为即使对于一个简单的扩充,你也不得不引入许多新的子类。

一般的对象组合技术和具体的委托技术,是继承之外组合对象行为的另一种灵活方法。新的功能可以通过新的方式组合已有对象,而不是通过定义已存在类的子类的方式加到应用中。另一方面,过多使用对象组合会使设计难于理解。

设计模式:Bridge,Chain ofResponsibility,Composite,Decorator,Observer,

Strategy

8) 不能方便地对类进行修改

有时你不得不改变一个难以修改的类。也许你需要源代码而又没有(对于商业类库),或者可能对类的任何改变会要求修改许多已存在的其他子类。

设计模式:Adapter,Decorator,Visitor


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

目的

设计模式

可变的方面

创建

Abstract Factory

产品对象家族

Builder

如何创建一个组合对象

Factory Method

被实例化的子类

Prototype

被实例化的类

Singleton

一个类的唯一实例

结构

Adapter

对象的接口

Bridge

对象的实现

Composite

一个对象的结构和组成

Decorator

对象的职责,不生成子类

Façade

一个子系统的接口

Flyweight

对象的存储开销

Proxy

如何访问一个对象;该对象的位置

行为

Chain of Responsibility

满足一个请求的对象

Command

何时、怎样满足一个请求

Interpreter

一个语言的文法和解释

Iterator

如何遍历、访问一个聚合的各元素

Mediator

对象间怎样交互、和谁交互

Memento

一个对象中哪些私有信息存在该对象之外,以及在什么时候进行存储

Observer

多个对象依赖于另一个对象,而这些对象又如何保持一致

State

对象的状态

Strategy

算法

Template Method

算法中的某些步骤

Visitor

某些可作用于一个(组)对象上的操作,但不修改这些对象的类


分享到:
评论

相关推荐

    web学习笔记 —— DAO设计模式

    NULL 博文链接:https://zisefeiniao.iteye.com/blog/395801

    JSP复习笔记——第11章 JSP 构架和MVC设计模式

    NULL 博文链接:https://depravedangel.iteye.com/blog/376043

    C#设计模式–单例模式

     近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二...

    AInter DesignMode

    最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二...

    MLDN魔乐JAVAWEB课堂26_MVC设计模式_代码

    讲解J2EE的核心设计模式——MVC的使用,本段主要讲解的是WEB端的MVC实现,包括RequestDispatcher接口的使用,并通过一个简单的代码阐述MVC的实现

    拼多多笔试题java-get-designpatterns:Java设计模式示例(24全)详尽笔记与代码示例

    为了自己能够系统有效地学习设计模式,也希望能够帮助到其他想对设计模式有了解的同学,我边学习边做了这个系列的设计模式笔记。 本系列主要由Java语言来实现。内容来自国外网站,并结合了其他相关内容,如阎宏博士...

    asp.net知识库

    Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述...

    iOS高级程序员进阶——语法雷区篇

    无论是Objective-C语言还是Swift语言,其都有非常巧妙的设计思想与丰富的语法特性。在编写程序时,编程语言是最基础的工具,工具是否用的顺手会直接影响到所编写程序的效率与质量。还有很多时候,一种场景我们知道...

    《流畅的Python》——读书笔记(1)

    第一部分 序幕 第1章 Python数据类型 普通方法、特殊方法 第二部分 数据结构 ...第6章 使用一等函数实现设计模式 第7章 函数装饰器和闭包 从定位参数到仅限关键字函数 函数修饰器与闭包 装饰器基础知识 装饰器何时执

    Java开发详解.zip

    031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java常用类库】_定时调度笔记.pdf 031201_【第12章:JAVA IO】_File类笔记.pdf ...

    Python学习笔记(五)——–Python迭代器

    迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。 关键点:遍访(遍历?)容器 二、迭代器特点 1.迭代器可以...

    (完整版)Python基础学习笔记.docx

    (完整版)Python基础学习笔记 (完整版)Python基础学习笔记全文共69页,当前为第1页。(完整版)Python基础学习笔记全文共69页,当前为第1页。Python 基础学习笔记 (完整版)Python基础学习笔记全文共69页,当前为第1页。...

    数据库系统原理——ER模型与关系模型(1).pdf

    数据库系统原理——ER模型与关系模型 犹记得第⼀次看《数据库系统原理》时看天书的感觉,云⾥雾⾥;现在已经是第⼆次参阅这本书了,顿时有所感悟,"哦,原来是这 样!"现在呢,开窍了⼀点,写下来且当作为笔记。 ER...

    《企业架构》读书笔记

    读后感《企业架构-价值网络时代企业成功的运营模式》这本书,是金根(http://www.cnblogs.com/zhoujg)给我们的推荐,我浏览了一遍,并阅读了两遍。也许是囿于作者的篇幅,也许是由于自己的阅历不够,这本书总体给我...

    解决Linux下RTL8723be无线网卡搜索不到wifi的问题——华硕笔记本安装deepin15.11无wifi信号

    早在大半年前,喵哥在一台机器上安装了较为出色国产操作系统——deepin。虽然也是定制的Linux,相对Ubuntu Kylin来说好得不止一星半点。deepin的桌面UI设计相当漂亮,它的应用软件生态在国内Linux系统中算是出类拔萃...

    软件测试面试题总结

    java程序员面试宝典、java程序员的基本修养、大话设计模式只看了重要的 )、测试相关(软件测试的艺术、从菜鸟到测试架构师、软件测试技术大全、selenium,qtp,junit的一些相关资料和书)、linux看了一点(鸟哥的...

    重构,改善现有代码——代码坏味道

    该文档是以前整理的笔记本,主要是针对代码坏问道的一些描述和一些解决办法。东西都是摘录的,虽然距离现在差多十几年,但是感觉还是可用的,所以分享一下。

    《动手学——卷积神经网络进阶》笔记

    神经网络的特征提取:通过学习得到数据的多级表征,并逐级表⽰越来越抽象的概念或模式。 AlexNet 首次证明了学习到的特征可以超越⼿⼯设计的特征,从而⼀举打破计算机视觉研究的前状。 特征: 8层变换,其中有5层...

    高级java笔试题-Java-Note:一个Java程序员的笔记本

    设计模式最佳实践: 《Redis 设计与实现》参考: 社区 book list 互联网的四大特征: 开放的精神,分享的心态,全球化的眼光,责任感。 —— 马云 Java: 深入理解Java虚拟机 第二版,周志明 码出高效-Java开发手册, ...

    java8集合源码分析-LearningNotes:Java笔记

    java8 集合源码分析 编程笔记 学习、总结、记录 ! —— since 2018/20 :bar_chart: :hot_beverage: ...数组、栈、队列、链表、二分搜索树、集合、映射、...种设计模式逐步更新 包含 Servlet & JSP、Spring、SpringMVC、My

Global site tag (gtag.js) - Google Analytics