设计模式——什么是设计模式

我的在CSDN上的相关BLOG:http://blog.csdn.net/feb13/article/details/7824565算法

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

什么是设计模式

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

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

问题(problem)描述了应该在何时或者什么状况下使用该模式。它解释了设计问题和问题存在的来龙去脉,它可能描述了特色的设计问题,也可能描述了致使不灵活设计的类或对象结构。学习

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

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

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

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

 

23种设计模式的基本意图

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

适配器(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

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

相关文章
相关标签/搜索