设计模式是软件开发过程中面临的一般问题解决方案,每种模式都描述了一个我们周围不断重复发生的问题,以及该问题的核心解决方案。
设计模式主要分三种类型:
- 创建型:主要解决对象的创建问题,封装复杂的创建过程量,解耦对象的创建代码和使用代码
- 结构型:主要通过类对象的不同组合,解耦不同功能的耦合
- 行为型:主要解决的是类或对象之间的交互行为的耦合
类型 | 模式 | 说明 | 适用场景 |
---|---|---|---|
创建型 | 单例 | 一个类只允许创建一个实例或对象,并为其提供一个全局的访问点 | 无状态、全局唯一、控制资源访问 |
工厂、抽象工厂 | 创建一个或者多个相关的对象,而使用者不用关心具体的实现类 | 分离对象的创建和使用 | |
建造者 | 用于创建一种类型的复杂对象,通过设置不同的可选参数进行“定制化” | 对象的构造参数较多且多数可选 | |
原型 | 通过复制已有对象来创建新的对象 | 对象的创建成本较大且同一类的不同对象之间差别不大 | |
结构型 | 代理 | 不改变原始类和不使用继承的情况下,通过引入代理类来给原始类附加功能 | 增加代理访问,比如监控,缓存,限流,事务,RPC |
装饰者 | 不改变原始类的情况下,通过组合的方式动态扩展原始类的功能 | 动态扩展类的功能 | |
适配器 | 不改变原始类的情况下,通过组合的方式使其适配新的接口 | 复用现有类,但与期望接口不适配 | |
桥接 | 当类存在多个独立变化的维度时,通过组合的方式使得其可以独立进行扩展 | 存在多个维度的继承体系时 | |
外观模式 | 为子系统中一组接口定义一个更高层的接口,使得子系统更加容易使用 | 解决接口复用性(细维度)与接口易用性(粗维度)的矛盾 | |
组合 | 将对象组合成树形结构以表示部分-整体的层次结构,统一单个对组合对象的处理逻辑 | 满族部分与整体这种树形结构 | |
享元 | 运用共享技术有效的支持大量细粒度的对象 | 当系统存在大量的对象,这些对象的很多字段取值范围固定 | |
行为型 | 观察者 | 多个观察者监听同一主题对象,当主题对象状态发生变化时通知所有的观察者,使它门能够自动更新自己 | 解耦事件创建者与接收者 |
模板 | 定义一个操作中算法的骨架,将某些步骤实现延迟到子类中 | 解决复用与扩展问题 | |
策略 | 定义一组算法类,将每个算法分别封装起来,使得他们可以相互替换 | 消除各种if-else分支判断,解耦策略的定义、创建、使用 | |
状态 | 允许一个对象在其内部状态改变的时候改变其行为 | 分离对象的状态与行为 | |
职责链 | 将一组对象连成一条链,请求沿着该链传递,知道某个对象能够处理它为止 | 解耦请求的发送者与接收者 | |
迭代器 | 提供一种方法顺序访问一个集合对象的各个元素,但不暴露该对象的内部表示 | 解耦集合对象的内部表示与遍历访问 | |
访问者 | 封装一些作用于某种数据结构中各元素的操作,在不改变数据结构的前提下,定义作用于这些元素的新操作 | 分离对象的数据结构与行为 | |
备忘录 | 在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象为先前的状态 | 用于对象的备份与恢复 | |
命令 | 将不同的请求封装成对应的命令对象,对命令的执行进行控制且对使用方透明 | 用于控制命令的执行,比如异步、延迟、排队、撤销、存储与撤销 | |
解释器 | 为某个语言定义它的语法表示,并定义一个解释器来处理这个语法 | 用于编辑器,规则引擎,正则表达式等特定场景 | |
中介者 | 定义一个单独的中介对象,来封装一组对象之间的交互,避免对象之间的直接交互 | 使各个对象不需要显示的相互引用,从而使其耦合松散 |