设计模式描述了在面向对象编程中不断重复发生的问题以及该问题的解决方案的核心,通过设计模式就可以一次一次的使用该方案而不必做重复劳动。
设计模式的分类
根据两条准则来对设计模式进行分类,一是目的准则,即模式是用来完成什么工作的。模式依据其目的可分为创建型、结构型、行为型三类。创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述。
二是范围准则,指定模式主要是用于类还是用于对象。类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就确定下来,为静态的;对象模式处理对象间的关系,这些关系在运行时刻是可以变化的,为动态的。从某种意义上讲,几乎所有模式都使用继承机制,所以“类模式”只指那些集中于处理类间关系的模式,而大部分模式都属于对象模式的范畴。
创建型 | 结构型 | 行为型 | |
---|---|---|---|
类 | Factory Method | Adapter(类) | Interpreter TemplateMethod |
对象 | Abstract Factory Builder Prototype Singleton |
Adapter(对象) Bridge Composite Decorator Facade Flyweight Proxy |
Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor |
设计模式怎样解决设计问题
1. 寻找合适的对象
面向对象设计最困难的部分是将系统分解成对象集合。要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、演化、复用等等,他们都影响系统的分解,并且这些因素通常还是相互冲突。
设计模式用于帮助确定并不明显的抽象和描述这些抽象的对象。
2. 决定对象的粒度
对象在大小和数目上变化极大,他们能表示下自硬件或上至整个应用的任何事物。设计模式帮助确定一个对象应该是什么,比如 Facade模式描述了怎样用对象表示完整的子系统,Flyweight模式描述了如何支持大量的最小粒度的对象,其他的一些模式描述了将一个对象分解成许多小对象的特定方法,Abstract Factory和Builder产生那些专门负责生成其他对象的对象,Visitor和Command生成的对象专门负责实现对其他对象或对象组的请求。
3. 指定对象接口
对象声明的每一个操作指定操作名、作为参数的对象和返回值,即所谓的操作的型构。对象操作所定义的所有操作型构的集合称为该对象的接口。
在面向对象系统中,接口是基本的组成部分。对象只有通过它的接口才能与外部交流,且对象接口与其功能是完全分离的,不同对象对请求有不同的实现,两个有相同接口的对象可以有完全不同的实现,发送给对象的请求和对象的相应操作在运行时刻的连接称为动态绑定。
4. 描述对象的实现
针对接口编程,而不是针对实现编程。
5. 运用复用机制
对象组合技术、继承、参数化类型的比较:
对象组合技术允许你在运行时刻改变被组合的行为,但是它存在间接性,比较低效;继承允许你提供操作的缺省实现,并通过子类重定义这些操作;参数化类型(比如使用类模板)允许你改变类所用到的类型,但是继承和参数化类型都不能在运行时刻改变。
6. 关联运行时刻和编译时刻的结构
一个面向对象程序运行时刻的结构通常与它的代码结构相差较大,代码结构在编译时刻就被确定下来,它由继承关系固定的类组成;程序的运行时刻结构是由快速变化的通信对象网络组成。
7. 设计应支持变化
获取最大限度复用的关键在于对新需求和已有需求发生变化时的预见性,要求你的系统设计要能够相应的改进。
设计模式可以确保系统能够以特定方式变化,从而帮助你避免重新设计系统。每一个设计模式允许系统结构的某个方面的变化独立于其他方面,这样产生的系统对于某一种特殊变化将更健壮。
怎样选择设计模式
1. 考虑设计模式是怎样解决设计问题的
2. 浏览模式的意图部分
3. 研究模式怎样互相关联
4. 研究目的相似的模式
5. 检查重新设计的原因
6. 考虑你的设计中哪些是可变的
注:内容大部分来自《设计模式——可复用面向对象软件的基础》一书