设计模式系列文章导航

  1. 设计模式概述 📍当前位置
  2. 面向对象设计原则
  3. 设计模式 - 创建型模式
  4. 设计模式 - 结构型模式
  5. 设计模式 - 行为型模式

什么是设计模式

  • 设计模式是一种用于对软件系统中不断重现的设计问题的解决方案进行文档化的技术,目的是提高代码的可维护性、可扩展性、重用性和可靠性,以及让他人更容易理解代码。

  • GoF对设计模式的定义如下:

    设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用。

设计模式的基本要素

  1. 模式名称

    每种设计模式都有一个名称来描述模式的问题、解决方案和效果,以便开发人员更好地理解模式并方便沟通交流。

  2. 问题

    问题描述了应该在何时使用模式,包含了设计中存在的问题以及问题存在的原因。

  3. 解决方案

    解决方案描述了设计模式的组成成分,以及这些组成成分之间的相互关系、各自的职责和协作方式。

  4. 效果

    效果描述了模式应用的效果以及在使用模式时应权衡的问题。

设计模式的分类

  • 通常情况下都是按照目的来划分各种设计模式,可以分为创建型(Creational)、结构性(Structural)和行为型(Behavioral)3类。
  • 以下23种设计模式并非都是孤立存在的,很多模式之间存在联系,例如访问者模式操作对象结构中的元素时通常需要使用迭代器模式,在解释器模式中定义终结符表达式和非终结符表达式时可以使用组合模式。因此,如果合理搭配不同的设计模式,可以充分发挥每种设计模式的优势,完成一些更复杂的设计工作。

创建型模式

  • 创建型模式主要用于创建对象,包括如下5种模式:
模式名称 英文名称 模式说明 使用频率
抽象工厂模式 Abstract Factory 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 ★★★★★
建造者模式 Builder 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 ★★☆☆☆
工厂方法模式 Factory Method 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类 ★★★★★
原型模式 Prototype 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 ★★★☆☆
单例模式 Singleton 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例 ★★★★☆

结构型模式

  • 结构型模式主要用于处理类或对象的组合,包括如下7种模式:
模式名称 英文名称 模式说明 使用频率
适配器模式 Adapter 将一个类的接口转换成客户希望的另一个接口,让不兼容的类可以一起工作 ★★★★☆
桥接模式 Bridge 将抽象部分与它的实现部分解耦,使得两者都能够独立变化 ★★★☆☆
组合模式 Composite 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构,让客户端可以统一对待单个对象和组合对象 ★★★★☆
装饰模式 Decorator 动态地给一个对象增加一些额外的职责,就扩展功能而言,装饰模式提供可一种比使用子类更加灵活的替代方案 ★★★☆☆
外观模式 Facade 为子系统中的一组接口提供一个统一的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 ★★★★★
享元模式 Flyweight 运用共享技术有效地支持大量细粒度对象的复用 ★☆☆☆☆
代理模式 Proxy 给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问 ★★★★☆

行为型模式

  • 行为型模式主要用于描述类或对象怎样交互和怎样分配职责,包括如下11种模式:
模式名称 英文名称 模式说明 使用频率
职责链模式 Chain of Responsibility 避免将一个请求的发送者与接受者耦合在一起,让多个对象都有机会处理请求,或接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止 ★★☆☆☆
命令模式 Command 将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作 ★★★★☆
解释器模式 Interpreter 给定一个语言,定义它的文法的一种表示,并给定一个解释器,这个解释器使用该表示方法来解释语句中的句子 ★☆☆☆☆
迭代器模式 Iterator 提供一种方法顺序访问一个聚合对象中的各个元素,而又不用暴露该对象的内部表示 ★★★★★
中介者模式 Mediator 定义一个对象来封装一系列对象的交互,中介者模式使各对象之间不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互 ★★☆☆☆
备忘录模式 Memento 在不破坏封装的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态 ★★☆☆☆
观察者模式 Observer 定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时其相关依赖对象皆得到通知并被自动更新 ★★★★★
状态模式 State 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎是修改了它的类 ★★★☆☆
策略模式 Strategy 定义一系列算法,将每一个算法封装起来,让他们可以相互替换,使得算法可以独立于使用它的客户而变化 ★★★★☆
模板方法模式 Template Method 定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 ★★★☆☆
访问者模式 Visitor 表示一个作用于某对象结构中的各个元素的操作,可以在不改变各个元素的类的前提下定义作用于这些元素的新操作 ★☆☆☆☆