GOF 23个基本的设计模式
Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
Adapter:将一个类的接口转换成客户希望的另外一个接口。A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Composite:将对象组合成树形结构以表示"部分-整体"的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为灵活。
Facade:为子系统中的一组接口提供一个一致的界面, F a c a d e模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
Flyweight:运用共享技术有效地支持大量细粒度的对象。
Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Proxy:为其他对象提供一个代理以控制对这个对象的访问。
Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。?
?
比较
?
设计模式
常用程度
适用层次
引入时机
结构复杂度
Abstract Factory
比较常用
应用级
设计时
比较复杂
Builder
一般
代码级
编码时
一般
Factory Method
很常用
代码级
编码时
简单
Prototype
不太常用
应用级
编码时、重构时
比较简单
Singleton
很常用
代码级、应用级
设计时、编码时
简单
Adapter
一般
代码级
重构时
一般
Bridge
一般
代码级
设计时、编码时
一般
Composite
比较常用
代码级
编码时、重构时
比较复杂
Decorator
一般
代码级
重构时
比较复杂
Facade
很常用
应用级、构架级
设计时、编码时
简单
Flyweight
不太常用
代码级、应用级
设计时
一般
Proxy
比较常用
应用级、构架级
设计时、编码时
简单
Chain of Resp.
不太常用
应用级、构架级
设计时、编码时
比较复杂
Command
比较常用
应用级
设计时、编码时
比较简单
Interpreter
不太常用
应用级
设计时
比较复杂
Iterator
一般
代码级、应用级
编码时、重构时
比较简单
Mediator
一般
应用级、构架级
编码时、重构时
一般
Memento
一般
代码级
编码时
比较简单
Observer
比较常用
应用级、构架级
设计时、编码时
比较简单
State
一般
应用级
设计时、编码时
一般
Strategy
比较常用
应用级
设计时
一般
Template Method
很常用
代码级
编码时、重构时
简单
Visitor
一般
应用级
设计时
比较复杂
注:常用程度、适用层次、使用时机等基于自己的理解,结构复杂度基于C#语言,表格中所有内容仅供参考。
?
原则、变化与实现
?
设计模式
变化
实现
体现的原则
Abstract Factory
产品家族的扩展
封装产品族系列内容的创建
开闭原则
Builder
对象组建的变化
封装对象的组建过程
开闭原则
Factory Method
子类的实例化
对象的创建工作延迟到子类
开闭原则
Prototype
实例化的类
封装对原型的拷贝
依赖倒置原则
Singleton
唯一实例
封装对象产生的个数
?
Adapter
对象接口的变化
接口的转换
?
Bridge
对象的多维度变化
分离接口以及实现
开闭原则
Composite
复杂对象接口的统一
统一复杂对象的接口
里氏代换原则
Decorator
对象的组合职责
在稳定接口上扩展
开闭原则
Facade
子系统的高层接口
封装子系统
开闭原则
Flyweight
系统开销的优化
封装对象的获取
?
Proxy
对象访问的变化
封装对象的访问过程
里氏代换原则
Chain of Resp.
对象的请求过程
封装对象的责任范围
?
Command
请求的变化
封装行为对对象
开闭原则
Interpreter
领域问题的变化
封装特定领域的变化
?
Iterator
对象内部集合的变化
封装对象内部集合的使用
单一职责原则
Mediator
对象交互的变化
封装对象间的交互
开闭原则
Memento
状态的辅助保存
封装对象状态的变化
接口隔离原则
Observer
通讯对象的变化
封装对象通知
开闭原则
State
对象状态的变化
封装与状态相关的行为
单一职责原则
Strategy
算法的变化
封装算法
里氏代换原则
Template Method
算法子步骤的变化
封装算法结构
依赖倒置原则
Visitor
对象操作变化
封装对象操作变化
开闭原则
?
?
学习
?
l?????????掌握设计模式的意图以及解决的问题
l?????????掌握设计模式所封装的变化点以及优缺点
l?????????了解设计模式的结构图以及各角色的职责
l?????????项目中是否应用了设计模式不重要,重要的是设计模式是否正确应用
l?????????项目中应用的设计模式和GOF设计模式的结构是否一致不重要,重要的是是否从这个结构中得意
l?????????不管用了还是没有用设计模式,如果违背了原则,就是不恰当的设计
l?????????没有设计模式是万能的,沉迷于获得一个解决方案的话可能会导致项目结构复杂、代码可读性差、并且造成项目延期
?
综合下面两个帖子:
http://www.cnblogs.com/Jackey_Chen/archive/2008/11/17/1335319.html
http://blog.csdn.net/hnwanghb/article/details/2055306
?