设计模式---观察者模式

设计模式---观察者模式

1、定义、结构

定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

结构


2、实现步骤

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

观察者模式实现的 2 种方式:推模型 & 拉模型
(1)推模型:目标对象主动向观察者推送目标的详细信息。推送的信息通常是目标对象的全部或部分数据。
(2)拉模型:目标对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到目标对象中获取,相当于是观察者从目标对象中拉数据。

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

3、Java自带的Observer实现

利用Java提供的观察者实现----
java.util包中 Observable类,接口Oberver中的update()方法

Java 实现 VS 自己实现的对比4点
(1)不需要再定义观察者和目标接口(JDK已经定义)
(2)具体的目标实现里面不需要再维护观察者的注册信息,Java中的Observable类里面已经实现
(3)触发通知的方式有一点变化,要先调用setChanged方法,这个是Java为了帮助实现更精确的触发控制而提供的功能。
(4)具体观察者的实现里面,update方法其实能同时支持推模型和拉模型,这个Java在定义的时候,已经考虑

4、优缺点

观察者的优点
(1)观察者模式实现了观察者和目标之间的抽象耦合
(2)观察者模式实现了动态联动(一个操作会引起其他相关的操作)
(3)观察者模式支持广播通信
观察者的缺点:
可能引起无谓的操作!

5、适用场景

建议 在以下情况中选用观察者模式:
(1)当一个抽象模型有 2 个方面,其中一个方面的操作依赖于另一个方面的状态变化。
(2)如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变。
(3)当一个对象必须通知其他的对象,但是你又希望这个对象和其他被通知的对象是松散耦合

区别对待观察者

在循环通知的时候,通过分支判断来对不同的观察这进行区别对待

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值