清单
模式 | 概要 | 什么时候选用 | 注意 | 实操 |
---|---|---|---|---|
观察者 | 在对象之间定义一个一对多的依赖关系,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知 | · 观察者变动较频繁 · 希望借助异步来提高吞吐量 |
· 同步阻塞 · 异步非阻塞 · 进程内 · 进程间 |
· 线程池 · 消息队列 |
模板 | 在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现,这里的“算法”可以理解为广义上的“业务逻辑” | · 复用 · 扩展 |
- | · 继承 · 抽象 |
策略 | 定义一簇算法类,将每个算法分别封装起来,让它们可以互相替换 | · 概念上属于同类的不同对象,可对外暴露同样的接口,而各自有不同的实现 · 添加新“策略”时可以最小化、集中化代码改动 |
- | · 不同策略实现相同的接口或继承相同的父类 · 工厂类运行时确定选用的“策略” · 查表法或if-else分支判断 |
职责链 | 将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够过处理它为止 | · 过滤器 · 拦截器 |
- | · 处理器Filter · 处理器链FilterChain |
状态 | 状态机的一种实现方式 | 状态种类不太多,而事件触发的动作比较复杂 | - | · 每种状态封装成一个类,将事件和动作包在其中 |
迭代器 | 用来遍历集合对象 | - | 遍历的同时增删集合元素,会发生未决行为 | · 容器,定义iterator()方法 · 迭代器,定义三个方法:hasNext(), currentItem(), next() |
访问者 | 允许一个或者多个操作应用到一组对象上,解耦操作和对象本身 | 很少用,不好理解 | - | 将操作独立出来一个类,对一组不同的对象进行操作 |
备忘录 | 在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态 | 用来防丢、撤销、恢复等 | - | 对于大对象的备份,可以低频全量备份,高频增量备份 |
命令模式 | 将请求(命令)封装为一个对象,这个对象支持被传递,从而能够将请求(命令)做排队、异步执行等操作 | 用来控制命令的执行,比如异步、延迟、排队、撤销重做等 | - | 很少用 |
解释器 | 为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法 | 如:翻译器,计算器,自定义接口告警规则等 | - | 一般做法是,将语法规则拆分成一些小的独立单元,然后对每个单元进行解析,最终合并为整个语法规则的解析 |
中介 | 定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互 | 只有当参与者之间的交互关系错综复杂,维护成本很高的时候,我们才考虑使用中介模式 | 好处是简化了一组对象之间的交互,坏处是中介类可能会编程大而复杂的“上帝类” | 引入中介这个中间层,将一组对象之间的交互关系(或者依赖关系)从多对多(网状关系)转换成一对多(星状关系) |
- | - | - | - | - |
设计模式要干的事情就是解耦
- 创建型模式是将创建和使用代码解耦
- 结构型模式是将不同的功能代码解耦
- 行为型模式是将不同的行为代码解耦
- 观察者模型,是将观察者和被观察者代码解耦
模板模式
- 复用
- 所有子类可以复用父类中提供的模板方法的代码
- 扩展
- 框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能
回调
- 简介
- 回调是一种双向调用关系。A类事先注册某个函数F到B类,A类在调用B类中的P函数的时候,B类反过来调用A类注册给它的F函数。这里的F函数就是“回调函数”。A调用B,B反过来又调用A,这种调用机制就叫做“回调”。
- 同步回调
- 函数返回之前执行回调函数
- 像模板模式
- 从代码实现上来看,回调和模板模式完全不同。回调基于组合关系来实现,把一个对象传递给另一个对象,是一种对象之间的关系;模板模式基于继承关系来实现,子类重写父类的抽象方法,是一种类之间的关系。
- 异步回调
- 函数返回之后执行回调函数
- 像观察者模式
策略模式
- 解耦的是策略的定义、创建、使用三个部分
状态机
- 三种实现方式
- 分支逻辑法
- 利用if-else或者switch-case;对简单状态机来说,这个方式最简单直接。
- 查表法
- 对于状态非常多,状态转移比较复杂的状态机,这个方式比较合适;通过二维数组来表示状态转移图,能极大提高代码的可读性和可维护性。
- 状态模式
- 对于状态不多,状态转移也比较简单,但事件触发执行的动作包含的业务逻辑可能比较复杂的状态机来说,这个方式是首选。
- 分支逻辑法
迭代器模式
- 遍历集合一般有三种方式:for循环、foreach循环、迭代器遍历;后两种都可以看做迭代器遍历;
- 迭代器相对for循环的三个优势
- 迭代器模式封装集合内部的复杂数据结构,开发者不用了解如何遍历,直接使用容器提供的迭代器即可
- 迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一
- 迭代器模式让添加新的遍历算法更加容易,更符合开闭原则;另外,因为迭代器都实现自相同的接口,在开发中,基于接口而非实现编程,替换迭代器也更加容易
中介模式 vs 观察者模式
- 区别
- 观察者模式
- 参与者之间的交互比较有条理,一般都是单向的,一个参与者只有一个身份,要么是观察者,要么是被观察者。
- 中介模式
- 参与者之间的交互关系错综复杂,既可以是消息的发送者,也可以同时是消息的接收者。
- 观察者模式
网友评论