行为型模式 Behavioral Patterns
观察者模式 Observer Pattern
- 模式动机
- 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。发生改变的对象称为观察目标,被通知的对象称为观察者,一个观察目标可以对应对个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更容易扩展
- 模式定义
- 定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新
- 一种对象行为型模式
- 模式结构
- Subject 目标
- ConcreteSubject 具体目标
- Observer 观察者
- ConcreteObserver 具体观察者

- 模式分析
- 描述如何建立对象与对象之间的依赖关系
- 一个目标可以有任意数目的与之相依赖的观察者,一旦目标的状态发生改变,所以的观察者都将得到通知
- 交互也称为发布——订阅 publish-subscribe
- 模式优缺点
- 优点
- 实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口
- 在观察目标和观察者之间建立一个抽象的耦合
- 支持广播通信
- 符合开闭原则
- 缺点
- 将所有的观察者都通知到会花费很多时间
- 观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃
- 没有相应机制让观察者知道所观察的目标对象是怎么发生变化的
- 优点
- 适用环境
- 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用
- 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度
- 一个对象必须通知其他对象,而并不知道这些对象是谁
- 需要在系统中创建一个触发链,链式触发机制
- 模式应用
- 委派事件模型 DEM = Delegation Event Model
- 事件发布者称为事件源,订阅者称为事件监听器,这个过程还可以通过事件对象来传递与事件相关的信息
- 事件源对象、事件监听对象和事件对象构成了java事件处理模型的三要素
- 委派事件模型 DEM = Delegation Event Model
- 模式扩展
- MVC 模式 Model-View-Controller
- 一种架构模式,包含三个角色:模型 Model,视图 View 和控制器 Controller
- 观察者模式可以用来实现MVC你是,观察目标是Model,观察者是View,Controller充当两者之间的中介者
- 当模型层的数据发生改变时,视图层将自动改变其显示内容
- 响应式编程 Reactive Programming
- 一种以数据流和变化传播为核心的编程范式,通过声明式方式描述数据之间的依赖关系,并自动相应数据变化
- MVC 模式 Model-View-Controller
中介者模式 Mediator Pattern
- 模式动机
- 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题
- 系统结构复杂
- 对象可重用性差
- 系统扩展性低
- 单一职责原则
- 为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式
- 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题
- 模式定义
- 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
- 又称为调停者模式,一种对象行为型模式
- 模式结构
- Mediator 抽象中介者
- ConcreteMediator 具体中介者
- Colleague 抽象同事类
- ConcreteColleague 具体同事类

- 模式分析
- 中介者模式可以使对象之间的关系数量急剧减少
- 中介者承担两方面职责
- 中转作用(结构性)
- 通过中介者提供的中转作用,各个同事对象就不再需要显示引用其他同事,当需要和其他同事进行通信时,通过中介者即可
- 协调作用(行为性)
- 中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装
- 中转作用(结构性)
- 模式优缺点
- 优点
- 简化了对象之间的交互
- 将各同事解耦
- 减少子类生成
- 可以简化各同事类的设计和实现
- 缺点
- 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护
- 优点
- 模式适用环境
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解
- 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类
- 模式应用
- 事件驱动类软件
- MVC中的Controller
- 模式扩展
- 中介者模式与迪米特法则
- 通过创造出一个中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少
- GUI开发
- 复杂界面可能存在多个界面组件之间的交互关系,通过中介者类将这些交互的组件作为具体的同事类把它们之间的引用和控制关系交由中介者负责
- 中介者模式与迪米特法则
模版方法模式
- 模式动机
- 模版方法模式基于继承,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中
- 准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现
- 模式定义
- 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
- 类行为型模式
- 模式结构
- AbstractClass 抽象类
- ConcreteClass 具体子类

- 模式分析
- 结构图中只有类之间的继承关系,没有对象关联关系
- 开发抽象类和开发具体子类的设计师之间进行协作,一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。实现这些具体逻辑步骤的方法称为基本方法(Primitive Method),而将这些基本方法汇总起来的方法称为模版方法(Template Method)
- 模版方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或一个总行为的方法
- 基本方法是实现算法各个步骤的方法
- 钩子方法 Hook Method
- 给子类一个“可选择的扩展点”,让子类在不改变算法整体结构的前提下,决定某些步骤是否执行、如何执行,或者在特定位置插入额外行为
- 通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制
- 模式优缺点
- 优点
- 在一个类中抽象地定义算法,而它的子类实现细节的处理
- 一种代码复用的基本技术
- 导致一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合开闭原则
- 缺点
- 每个不同的实现都需要定义一个子类,导致类的个数增加
- 优点
- 模式适用环境
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复
- 对一些复杂的算法进行分割
- 控制子类的扩展
- 模式应用
- 框架设计
- Junit中TestCase类的设计
- 模式扩展
- 恰当使用继承
- 好莱坞原则
- 父类控制对子类的调用
- 钩子方法
- 使得子类可以控制父类的行为
- 可以对其他方法进行约束
英文补充 English Supplement
Observer Pattern 观察者模式
英文定义:
Define a one-to-many dependency between objects so that when one object changes state,
all its dependents are notified and updated automatically.
中文意思:
定义对象之间的一种一对多依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
核心术语:
| English | 中文 | 说明 |
|---|---|---|
| Subject | 目标 / 主题 | 被观察的对象 |
| ConcreteSubject | 具体目标 | 保存状态,状态变化时通知观察者 |
| Observer | 观察者 | 定义更新接口 |
| ConcreteObserver | 具体观察者 | 接收通知并更新自身状态 |
| attach | 注册 / 添加观察者 | 把观察者加入通知列表 |
| detach | 注销 / 删除观察者 | 从通知列表移除观察者 |
| notify | 通知 | 遍历观察者并调用 update |
| update | 更新 | 观察者收到通知后的响应方法 |
| publish-subscribe | 发布-订阅 | Observer 的另一种常见说法 |
考试表达:
- Observer Pattern supports loose coupling between the subject and observers.
- The subject does not need to know the concrete classes of its observers.
- It is useful when a change to one object requires changing others, and the number of dependent objects is unknown.
- A common drawback is that notifying many observers may be expensive.
DEM Delegation Event Model 委派事件模型
Event Source
Event Listener
Event Object
- Event Source 事件源:事件的发布者,例如按钮、窗口、输入框。
- Event Listener 事件监听器:事件的订阅者,负责响应事件。
- Event Object 事件对象:封装事件相关信息,例如点击位置、触发时间、事件类型。
可以把 DEM 理解为观察者模式在 Java 事件处理中的一种应用。
MVC and Observer
Model-View-Controller
- Model 模型:保存数据和业务状态,通常相当于 Subject。
- View 视图:显示数据,通常相当于 Observer。
- Controller 控制器:接收用户输入,协调 Model 和 View。
典型关系:
When the model changes, the views are notified and updated.
当模型改变时,视图被通知并自动更新。
Mediator Pattern 中介者模式
英文定义:
Define an object that encapsulates how a set of objects interact.
Mediator promotes loose coupling by keeping objects from referring to each other explicitly,
and it lets you vary their interaction independently.
中文意思:
定义一个对象来封装一组对象之间的交互。中介者通过避免对象之间显式相互引用来促进松耦合,并允许独立改变它们之间的交互。
核心术语:
| English | 中文 | 说明 |
|---|---|---|
| Mediator | 抽象中介者 | 定义同事对象之间通信的接口 |
| ConcreteMediator | 具体中介者 | 封装具体交互逻辑 |
| Colleague | 抽象同事类 | 与中介者交互的对象抽象 |
| ConcreteColleague | 具体同事类 | 具体参与交互的对象 |
考试表达:
- Mediator Pattern reduces many-to-many relationships among objects.
- It replaces complex object-to-object communication with communication through a mediator.
- The disadvantage is that the mediator may become too complex.
一句话:
Observer: one object changes, many objects are notified.
Mediator: many objects communicate through one mediator.
Template Method Pattern 模板方法模式
英文定义:
Define the skeleton of an algorithm in an operation,
deferring some steps to subclasses.
Template Method lets subclasses redefine certain steps of an algorithm
without changing the algorithm's structure.
中文意思:
在一个操作中定义算法骨架,把某些步骤延迟到子类中实现。模板方法允许子类在不改变算法结构的情况下重定义算法的某些步骤。
核心术语:
| English | 中文 | 说明 |
|---|---|---|
| AbstractClass | 抽象类 | 定义模板方法和基本方法 |
| ConcreteClass | 具体子类 | 实现可变步骤 |
| Template Method | 模板方法 | 定义算法骨架的方法 |
| Primitive Method | 基本方法 | 算法中的具体步骤 |
| Hook Method | 钩子方法 | 可选扩展点,子类可选择覆盖 |
| Hollywood Principle | 好莱坞原则 | Don’t call us, we’ll call you |
好莱坞原则:
Don't call us, we'll call you.
别调用我们,我们会调用你。
在模板方法中,意思是:子类不要主动控制整体流程,而是由父类的模板方法控制流程,并在适当位置调用子类实现的步骤。
三个模式快速区分
| Pattern | 核心问题 | 关键关系 |
|---|---|---|
| Observer | 状态变化后通知依赖对象 | 一对多依赖 |
| Mediator | 多个对象交互太复杂 | 多对多变成一对多 |
| Template Method | 算法流程固定,部分步骤变化 | 父类控制流程,子类实现步骤 |
高频英文术语 Glossary
| English Term | 中文 |
|---|---|
| Behavioral Pattern | 行为型模式 |
| dependency | 依赖 |
| one-to-many dependency | 一对多依赖 |
| notification | 通知 |
| automatic update | 自动更新 |
| loose coupling | 松耦合 |
| publish-subscribe | 发布-订阅 |
| event source | 事件源 |
| event listener | 事件监听器 |
| event object | 事件对象 |
| mediator | 中介者 |
| colleague | 同事对象 |
| interaction | 交互 |
| algorithm skeleton | 算法骨架 |
| defer to subclasses | 延迟到子类 |
| primitive method | 基本方法 |
| hook method | 钩子方法 |
| reverse control structure | 反向控制结构 |