设计模式--观察者模式

定义

在对象之间定义了一对多的依赖,当一方发生改变时,依赖它的对象都会受到通知并自动更新。

其实可以理解为消息发布者(被观察者)与订阅者(观察者),用户可以订阅或者取消订阅发布者的消息,当有新消息时发布者能够将其推送给所有的订阅者,当然订阅者也可以通过监听消息状态的改变来拉去消息。
下图为一个简单的发布者对象与订阅者对象:
这里写图片描述
当然java中也有自带的观察者模式中的观察者(订阅者)和被观察者(发布者),后面会进行介绍并对其源码进行分析:

OO原则

OO的基础为抽象,而观察者模式则是通过封装变化,多用组合少用继承,并且通过针对借口编程,来为交互对象之间的松耦合设计而努力的。

Java内置观察者模式源码分析

分析源码之前先发个图,后面分析源码按照图上面的步骤介绍:
这里写图片描述
java中内置的观察者模式:
被观察者: java.util.Observable
这里写图片描述
观察者: java.util.Observer
这里写图片描述

Observer是个接口其中只有一个update方法,此方法用来接口消息推送,当使用内置的观察者模式时需要实现Observer接口并且实现update方法。
Observable是个class,其所有方法上面截图中也有做介绍,其他方法相对简单,我们主要来介绍下notifyObservers方法:
这里写图片描述
其中①是为了在更新观察者时有更多的扩展性,比如说,如果没有changed属性,则只要消息状态改变就会通知所有的观察者,而如果使用changed属性,我们则可以做到当有5个新消息时候才使用setChanged方法改变状态,然后再通知所有观察者。
其中②中的arrLocal也就是obs存放的是所有的观察者,②就是遍历所有的观察者(观察者需实现Observer接口),并且调用其update方法通知所有观察者。
然后我们看下申请成为观察者addObserver和取消观察者身份的方法deleteObserver,其实就是对objs中的元素的添加和删除,如下:
这里写图片描述
然后还有个hasChanged方法:
这里写图片描述
如果使用被观察者推送消息的方式,那么hasChanged方法是用不上的,但是如果使用观察者主动拉去消息消息时,则可以使用hasChanged方法判断消息状态,然后来拉取消息,但是Observable类中是没有给提供主动拉取的方法,如果使用主动拉去的方式,则需要继承Observable类然后定义给观察者主动拉取的方法。

总结

观察者模式定义了对象之间的一(被观察者)对多(观察者)关系,其中被观察者使用一个共同的接口来更新所有的观察者,观察者与被观察者之间是松耦合的关系 ,被观察者不知道观察者的细节,只知道观察者实现了共同的接口,使用此模式可以使用被观察者推送或者观察者拉取的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值