设计模式学习—观察者模式

时间:2024-05-19 19:53:23

观察者模式分析思路介绍:

  • 观察者模式介绍
  • 观察者模式实战
  • 观察者模式详解
  • 观察者模式衍生

一、观察者模式介绍

  • 定义: 定义对象间一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 案例场景描述: 小明是天气预报部门的员工能获取最新的天气环境的数据,所以他的女朋友和老妈可以及时的了解到相关天气信息,从而合理的安排她们各自出行的相关行程,这就是一个典型的观察者模式案例。

二、观察者模式实战

1、通用代码的定义步骤:

  • 第一:目标对象的定义
  • 第二:具体目标对象的定义
  • 第三:观察者接口的定义
  • 第四:观察者的具体实现

2、结合案例场景分析

方式一:拉模型实现

1)目标对象的定义
设计模式学习—观察者模式
2)具体目标对象的实现设计模式学习—观察者模式
3)观察者接口的定义
设计模式学习—观察者模式
4)具体观察者的实现
设计模式学习—观察者模式
5)Test类的实现
设计模式学习—观察者模式
6)最终执行结果
设计模式学习—观察者模式

方式二:推模型实现

1)目标对象的定义
设计模式学习—观察者模式
2)具体目标对象的实现设计模式学习—观察者模式
3)观察者接口的定义
设计模式学习—观察者模式
4)具体观察者的实现
设计模式学习—观察者模式
5)Test类的实现
设计模式学习—观察者模式
6)最终执行结果
设计模式学习—观察者模式

三、观察者模式详解

1、观察者模式的调用顺序

1)准备阶段

  • 创建目标对象
  • 创建观察者对象
  • 向目标对象注册观察者对象

2)运行阶段

  • 改变目标对象的状态
  • 通知所有注册的观察者对象进行相应的处理
  • 回调目标对象,获取相应的数据

2、推模型和拉模型两种实现方式

1)拉模型

  • 目标对象再通知观察者的时候只传递少量信息,如果观察者需要更具体的信息,由观察者主动到目标对象中获取,相当于是观察者从目标对象中拉数据。一般这种模型的实现中,会把目标对象自身通过update方法传递给观察者。(例如《方式一:拉模型实现》中的例子就是一个拉模型)

2)推模型

  • 目标对象主动向观察者推送目标的详细信息,推送的信息通常是目标对象的全部或部分数据。例如《方式二:推模型实现》中的例子就是一个拉模型)

3)两者的比较

  • 推模型是假定目标对象知道观察者需要的数据。
  • 拉模型是目标对象不知道观察者具体需要什么数据,因此把自身传给观察者,由观察者来取值。
  • 推模型会使观察者对象难以复用。
  • 拉模型中update方法的参数是目标对象本身,基本上可以适应各种情况的需要。

3、利用Java提供的观察者实现

1)具体目标对象的实现设计模式学习—观察者模式
2)具体观察者的实现
设计模式学习—观察者模式
3)Test类的实现
设计模式学习—观察者模式
4)最终执行结果
设计模式学习—观察者模式

4、观察者模式的优缺点

1)优点

  • 观察者模式实现了观察者和目标之间的抽象耦合
  • 观察者模式实现了动态联动
  • 观察者模式支持广播通信

2)缺点

  • 广播模式可能会引起无谓的操作

5、何时使用观察者模式(触发联动的情况下)

  • 当一个抽象模型有两个方面,其中一个方面的操作依赖另一个方面的状态变化。
  • 如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变的时候。
  • 当一个对象必须通知其他的对象,但是你又希望这个对象和其他被通知的对象是松散耦合的时候。

四、观察者模式衍生

1、场景需求

  • 小明的女朋友只想接收下雨的天气预报
  • 小明的老妈想接收下雨或下雪的天气预报

2、解决思路

  • 在观察者中添加判断,同过不同的天气来广播给不同需求的观察者,以此来达到相关效果
    1)下雨广播给小明的女朋友和她老妈
    2)下雪只广播给小明的老妈
    3)其他情况都不广播

3、场景代码实现

1)目标对象的定义
设计模式学习—观察者模式
2)具体目标对象的实现设计模式学习—观察者模式
3)观察者接口的定义
设计模式学习—观察者模式
4)具体观察者的实现
设计模式学习—观察者模式
5)Test类的实现
设计模式学习—观察者模式
6)最终执行结果
设计模式学习—观察者模式