设计模式之旅—观察者模式

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

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

一、观察者模式介绍

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

二、观察者模式实战

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)最终执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值