设计模式--观察者模式

一时失言乱红尘 2021-06-11 15:11 593阅读 0赞

定义

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

其实可以理解为消息发布者(被观察者)与订阅者(观察者),用户可以订阅或者取消订阅发布者的消息,当有新消息时发布者能够将其推送给所有的订阅者,当然订阅者也可以通过监听消息状态的改变来拉去消息。
下图为一个简单的发布者对象与订阅者对象:
这里写图片描述
当然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 条评论,593人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式-观察模式

    观察者模式 引言 > 今天开车出去有事,还挺赶时间的,突然遇到了一个红灯,这红灯时间可真长,等了好久终于看到变绿灯了,赶紧开车过去。 正文 观察者模式是指多

    相关 设计模式-观察模式

    观察者模式也叫订阅发布模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    相关 设计模式——观察模式

      观察者模式——定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。   观察者

    相关 设计模式:观察模式

    一.简介 > QT的信号槽就是观察者模式,当事件发生之后(比如按钮被点击)就会发出一个信号,这种信号类似广播没有目的.当对象对信号感兴趣,就会通过 connect() 函

    相关 设计模式--观察模式

    定义 在对象之间定义了一对多的依赖,当一方发生改变时,依赖它的对象都会受到通知并自动更新。 其实可以理解为消息发布者(被观察者)与订阅者(观察者),用户可以订阅或者取消