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