概述
设计模式是一种通用的设计方法,实际开发中可能不止23种。为方便理解和应用,一般分为3类:
- 创建型,通过采用抽象类所定义的接口,封装系统中对象如何创建、组合等信息。工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
- 结构型:如何组合已有的类和对象以获得更大的结果。适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式
- 行为型:对象之间的职责及其提供服务的分配方式。责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模版方法模式、访问者模式。
根据处理范围不同,设计模式又可分为类模式和对象模式:
- 类模式:处理类与子类的关系,通过处理这些关系来建立继承,属于静态关系,在编译时候确定下来;
- 对象模式:处理对象之间的关系,运行时发生变化,属于动态关系。类模式可以理解为利用继承,对象之间是动态的使用组合的方式,按照设计原则来说,组合优于继承,所以可以尽可能选择对象模式。
创建型
抽象对象的实例化过程,将系统与实例的创建解耦。实例由专门的工厂来实现,从而使系统针对实例的抽象接口编程,不依赖任何接口的实现,从而让使用者不需要关注对象的创建细节
Singleton
单例模式:某个类只能生成一个实例,该类提供一个全局访问点供外部获取该实例,其拓展是有限多例模式。
Prototype
原型模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。如使用Object类的clone方法,快速复制对象。
FactoryMethod
工厂模式:定义一个用于创建产品的接口,由子类决定生产什么产品。由子类决定要创建的具体类是哪一个。
客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
AbstractFactory
抽象工厂模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关或相互依赖的产品(对象)。允许客户创建对象的家族,而无需指定他的具体类。
Builder
建造者模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
结构型
结构型模式主要用于处理类和对象的组合,以获得更大的结构。这个概念可以区分大多设计模式,但是也有些比较模糊的,例如:代理模式,既完成组合,也有职责的分配,但是它依赖被归类于结构型
Proxy
代理(Proxy)模式,为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。包装对象,以控制对此对象的访问。
Adapter
适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。封装对象,并提供不同的接口。
Bridge
桥接模式:将类的抽象与实现分离,使它们可以独立变化。用组合关系代替继承关系来实现的,从而降低抽象和实现这两个可变维度的耦合度。可以将接口和实现分离,提高可扩展性,对客户端隐藏实现的细节。
将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
Decorator
装饰模式:动态地给对象增加一些职责,即增加其额外的功能。包装一个对象,以提供新的行为。
装饰器和被装饰的对象有相同的接口,装饰器在使用时获得被装饰的对象,为其增加新的操作。
Facade
外观模式:门面模式,为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。简化一组类的接口。
外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
Flyweight
享元模式:运用共享技术来有效地支持大量细粒度对象的复用。
元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。
Composite
组合模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
行为型
行为型涉及到算法和对象间职责的分配,它还处理着对象或类之间的通信模式。在程序运行的时候总是流程复杂,需要很好的协调工作,常见行为型模式:
Template Method
模板方法模式:定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。由子类决定如何实现一个算法中的步骤。
模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。
Strategy
策略模式:定义一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户;其目的是将行为和环境分隔,当出现新的行为时,只需要实现新的策略类。。封装可以互换的行为,并使用委托来决定要使用哪一个。
Command
命令模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开;从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作。
命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。
Chain of Responsibility
职责链模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
State
状态模式:允许一个对象在其内部状态发生改变时改变其行为能力。封装基于状态的行为,并使用委托在行为之间切换。
Observer
观察者模式:多个对象间存在一对多的依赖关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。让对象能够在状态改变时被通知。
观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
Mediator
中介者模式:也叫调停者模式,定义一个中介对象来封装简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
中介者使得各对象不需要现实地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者对象的存在保证了对象结构上的稳定,也就说说系统的结构不会因为新对象的引入带来人量的修改工作。
调停者模式包装一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。
Iterator
迭代器模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。支持以不同的方式遍历一个聚合对象。
Visitor
访问者模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
Memento
备忘录模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适时把这个对象还原到存储起来的状态。
Interpreter
解释器模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。描述如何为语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子,语言指使用规定格式和语法的代码。
实战
某公司开发出一套图形界面显示构件库。基于该库构建图形界面时,用户要求为界面定制一些特效显示,如带滚动条、艺术字体,采用装饰者模式最为灵活。