【Java设计模式】详解系列 3.1.2行为型模式 : 观察者模式 — 模式详解

来源:互联网 发布:sqlserver history 编辑:程序博客网 时间:2024/05/16 19:17

本文相关内容请结合【Java设计模式】详解系列 3.1.1行为型模式 : 观察者模式 — 介绍+实战

认识观察者模式

我们从六大方面理解观察者模式

  • 第一 目标与观察者之间的关系
  • 第二 单向依赖
  • 第三 命名建议
  • 第四 触发通知的时机
  • 第五 观察者模式的调用顺序示意图
  • 第六 通知的顺序

1.目标与观察者之间的关系

  1. 根据模式的定义,观察者模式是典型的一对多模式。但是我们要注意:如果观察者只有一个,也是可以的,这样就变相的形成了观察者与对象一对一的关系

  2. 同样一个观察者也可以关注多个目标(上一点说的是一个目标对应多个或者一个观察者

注意:
例如上篇的代码示例中,如果 观察者1 订阅了天气预报的同时,还定义了报纸, 观察者1 就需要接受这两个目标的通知,但是如果天气目标和报纸目标都是使用了update回调方法,就会发生混淆,观察者1 就不知道是谁发送的通知。
简单的解决办法就是不同的观察者 应该为不同的目标 定义 不同的回调方法

2.单向依赖

只有观察者依赖目标而不是目标依赖观察者,二者之间的联系的主动权掌握在目标手中,只有目标知道到什么时候通知观察者。而目标始终是被动的,等待观察者的调用。

3.命名建议

  1. 目标接口的定义,建议在名称后跟Subject
  2. 观察者接口的定义,建议在名称后面跟Observer
  3. 观察者接口的更新方法,建议名称为update

4.触发通知的时机

触发时机主要体现在这段代码中,<1> 与 <2>之间的顺序,应该先改数据再通知(先一<1>后<2>),如果顺序颠倒,就会出现观察者与目标数据不匹配的问题

public void setWeatherContent(String weatherContent) {        //<1>设置天气内容        this.weatherContent = weatherContent;        //<2>内容有了,说明天气更新了,通知所有的订阅的人        this.notifyObservers();    }

5.观察者模式的调用顺序示意图

主要体现在两个阶段:

1. 准备阶段:
见图
2. 运行阶段:
1. 改变目标对象的状态对应:setWeatherContent
1.1 通知所有注册的观察者对象进行相应的处理对应:notifyObservers
1.1.1回调目标对象,获取相应的数据对应:update

这里写图片描述
这里写图片描述

6.通知的顺序

当目标信息改变后,通知观察者时的顺序是不确定,不同的观察者之间的等级是平行的,观察者实现的功能不能依靠目标通知的顺序,因为目标与观察者之间是没有相互依赖关系的。


有待补充

实现的两种方式:推模型和拉模型

利用Java提供的观察者实现

观察者优缺点

何时使用观察者模式

0 0
原创粉丝点击