“不考虑变化的设计可能会在未来面临重大的重新设计风险。” :埃里希伽玛
在面向对象设计中,模式是常见问题的一种典型解决方案。当一个解决方案在各种项目中一次又一次地出现时,最终会有人为其命名并详细描述它。这就是发现模式的方式。
模式就像预制的蓝图,我们可以对其进行自定义以解决代码中反复出现的问题。模式不是一段特定的代码,而是解决特定问题的一般思路或者概念。我们可以遵循模式详细信息,并实施适合程序的解决方案。
1995 年,Erich Gamma、John Vlissides、Ralph Johnson 和 Richard Helm 出版了《Design Patterns: Elements of Reusable Object-Oriented Software》一书(中文:设计模式:可复用面向对象软件设计),他们将设计模式应用于编程。由于名字太长,它被称为GOF书或四人帮的书。
为什么要学习这些设计模式
设计模式是针对常见软件设计问题的一组久经考验的解决方案。即使从未遇到过这些问题,学习设计模式仍然很有价值,因为它教会我们如何使用面向对象设计的原则解决各种问题。
通过提供模式术语,设计模式还可以促进团队成员之间的沟通。
设计模式的分类
设计模式分为三大类:
- 创建模式:提供对象创建机制,增加了现有代码的灵活性和重用性。
- 结构模式:解释了如何将对象和类组装成更大的结构,同时保持结构的灵活性和效率。
- 行为模式:负责对象之间的有效沟通和职责分配。
创建设计模式
创建模式提供了各种对象创建机制,增加了现有代码的灵活性和重用性。
GoF 设计模式中定义了 5 种创建设计模式:
- 单例:单例是一种创建设计模式,它确保一个类只有一个实例,并为这个实例提供一个全局访问点。
- 工厂:工厂方法是一种创建型设计模式,它提供了在超类中创建对象的接口,同时允许子类更改创建的对象类型。
- 抽象工厂:抽象工厂是一种创建设计模式,它允许生成相关对象的类,而无需指定它们的具体类。
- 构建器:构建器是一种创建设计模式,可逐步构建复杂的对象。可以使用相同的构造代码创建对象的不同类型和表示。
- 原型:原型是一种创建设计模式,它允许您复制现有对象,而不会使您的代码依赖于它们的类。
结构设计模式
结构设计模式解释了如何将对象和类组装成更大的结构,同时保持它们的灵活性和效率。
GoF 设计模式中定义了 7 种结构设计模式:
- 适配器:适配器是一种结构设计模式,它允许具有不兼容接口的对象进行通信。
- 复合:复合是一种结构设计模式,它允许您将对象组合成树结构,然后像处理单个对象一样使用这些结构。
- 代理: 代理是一种结构设计模式,允许提供占位符或替代另一个对象。使用代理,可以控制对原始对象的访问,允许在请求被传递到原始对象之前或之后执行某些操作。
- 享元:使用享元,可以通过在多个对象之间共享状态的公共部分而不是将所有数据保留在每个对象中,将更多对象放入 RAM。
- 外观:外观是一种设计模式,它为库、框架或任何其他类集提供简化的接口。
- 桥接: 允许将一个大类或一组密切相关的类拆分为两个独立的层次结构:抽象和实现,以独立开发。
- 装饰器:使用装饰器设计模式,可以通过将新行为放置在包含新行为的特殊包装对象中来将新行为附加到对象。
行为设计模式
行为模式涉及算法和对象之间的职责分配。
GoF 设计模式中定义了 11 种行为设计模式:
- 模板方法 :模板方法在超类中定义了算法的骨架,允许子类在不修改其结构的情况下覆盖特定步骤。
- 中介者 :使用中介者,可以减少对象之间的混乱依赖。该模式限制了对象之间的直接通信,并迫使它们仅通过中介进行协作。
- 责任链:责任 链允许您沿着处理程序链传递请求。收到请求后,每个处理程序决定是处理请求还是将其传递给链中的下一个处理程序。
- 观察者 :观察者模式允许你定义一种机制来通知多个对象他们正在观察的对象发生的事件。
- 策略 :使用策略,可以定义一系列算法,将它们放入不同的类,并使它们的对象可互换。
- 命令 :命令是一种行为设计模式,它将请求转换为包含有关它们的所有信息的独立对象。通过这种转换,您可以使用各种请求参数化方法,延迟或排队请求的执行,并支持可撤消的操作。
- 状态 :作为一种行为设计模式,状态允许对象在其内部状态发生变化时改变其行为。看起来好像对象改变了它的类。
- 访问者 :使用访问者模式,您可以将算法与它们操作的对象分开。
- 解释器 :解释器是一种行为设计模式
,它定义了一种语言的语法表示,并提供了一个解释器来处理这种语法。 - 迭代器 :一种称为迭代器的行为设计模式允许您遍历集合的元素而不暴露它们的底层表示。
- 备忘录 : 备忘录模式允许保存和恢复对象的先前状态,而无需透露其实现细节。
以上是23种模式的简介,在接下来一个月的文章中,我们一起来详细学习这些设计模式。