设计模式
Christopher Alexander 说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。尽管Alexander所指的是城市和建筑模式,但他的思想也同样适用于面向对象设计模式,只是在面向对象的解决方案,我们用对象和接口代替了墙壁和门窗。两类模式的核心都在于提供了相关问题的解决方案。
一般而言,一个模式有四个基本要素:
- 模式名称(pattern name)
一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上进行设计。基于一个模式词汇表,我们自己以及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到恰当的模式名也是我们设计模式编目工作的难点之一。
- 问题(problem)
描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
- 解决方案(solution)
描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
- 效果(consequences)
描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
设计模式的分类
大名鼎鼎的GoF合作出版了《设计模式:可复用面向对象软件的基础》,在这本书中一共记录了23种设计模式。
书中把设计模式分为了
创建型模式
创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
下面都是对象创建型模式
- ABSTRACT FACTORY(抽象工厂)
- BUILDER(生成器)
- FACTORY METHOD(工厂方法)
- PROTOTYPE(原型)
- SINGLETON(单例)
结构型模式
结构型模式涉及到如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。
- ADAPTER(适配器)- 类对象结构型模式
- BRIDGE(桥接)- 对象结构型模式
- COMPOSITE(组合) - 对象结构型模式
- DECORATOR(装饰) - 对象结构型模式
- FACADE(外观) - 对象结构型模式
- FLYWEIGHT(享元)- 对象结构型模式
- PROXY(代理) - 对象结构型模式
行为型模式
行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻划了在运行时难以跟踪的复杂的控制流。它们将你的注意力从控制流转移到对象间的联系方式上来。行为类模式使用继承机制在类间分派行为。行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。这里一个重要的问题是对等的对象如何互相了解对方。对等对象可以保持显式的对对方的引用,但那会增加它们的耦合度。在极端情况下,每一个对象都要了解所有其他的对象。
- CHAIN OF RESPONSIBILITY(职责链) - 对象行为型模式
- COMMAND(命令) - 对象行为型模式
- INTERPRETER(解释器) - 类行为型模式
- ITERATOR(迭代器) - 对象行为型模式
- MEDIATOR(中介者) - 对象行为型模式
- MEMENTO(备忘录) - 对象行为型模式
- OBSERVER(观察者) - 对象行为型模式
- STATE(状态) - 对象行为型模式
- STRATEGY(策略) - 对象行为型模式
- TEMPLATE METHOD(模板方法) 类行为型模式
- VISITOR(访问者) 对象行为者型模式