唠唠“观察者模式”

作者: 炒鸡可耐的小葵花 | 来源:发表于2017-09-17 22:07 被阅读89次

本小仙女在开发道路上渣了两年多以后,突然回过头想把以前不太理解的东西再捯饬捯饬,虽然还是很渣,但是学习还是必要的,万一哪天成大神了呢。哇咔咔。。。。

一.定义

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

其实,定义很好懂,就是说的只要一个被观察者发生一点变化,所有观察他的观察者能立马知道并且做出相应的反应。就拿广播机制举个例子吧。当你退出登录的时候,app中好多地方都要及时知道这一状态变化并及时做出反应,登录页面要变成未登录的状态,好多需要登录状态才能显示的模块要进行隐藏。所以在每个需要知道登录状态改变的地方我们去注册一个广播,当退出登录的时候发送广播,所有地方都能收到这一状态并及时做出响应。

二.图解

观察者模式让双方解除耦合,让耦合的双方都依赖于对象通知者一般用一个抽象类或者接口实现。下面看结构图(百度上拉下来的图,自己不会画)

观察者模式结构图

观察者模式的四个角色

1.抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。一般是一个抽象类或者一个接口来实现,常见的方法attatch(),detach(),notifyObserver();java提供java.util.Observable类支持,

2.具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。

3.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。定义的方法有update(),Java提供了java.util.Observer接口支持,

4.具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。

三.举例讲解

由于本小仙女是一个android程序媛,所以例子也是android相关。接下来说说BaseAdapter。看下图.

BaseAdapter

其中标注1的地方定义了一个DataSetObservable对象mDataSetObservable,然后标注2的注册方法里把传入的DataSetObserver对象注册到mDataSetObservable中,同理标注3为解除注册,标注4是mDataSetObservable通知变化,咋一看,和观察者模式结构图Subject好像呢,那么接着往下看,这个DataSetObservable到底是啥,看下图

DataSetObservable

可以看出,DataSetObservable继承了Observable。红框框出来的notifyChanged()方法中,同步锁了mObservers这个对象,然后for循环这个对象,拿出对象中的对象调用onChanged()方法。我们继续看mObservers是什么,看下图

Observable

在Observable中,我们找到了mObservers,它是一个ArrayList对象,存放了好多T对象,那泛型T对象是啥,上一步中,DataSetObservable继承了Observable<DataSetObserver>,所以这里的mObservers里都是DataSetObserver对象,我们在看下DataSetObserver,上图

DataSetObserver

DataSetObserver是一个抽象类,里面有onChanged()和OnInvalidated()两个方法。

到这里,整个观察者模式的结构非常清晰,抽象类Observable是抽象主题角色,DataSetObservable是一个具体主题角色,抽象类DataSetObserver是抽象观察者角色,程序员在需要的地方创建一个具体观察者角色继承DataSetObserver,然后调用BaseAdapte的registerDataSetObeserver。整个观察者模式就完美了,哈哈。

四.其他

其他使用到观察者模式的场景OnClickListener、ContentObserver、android.database.Observable等;还有组件通讯库RxJava、RxAndroid、EventBus。好说完手工。哈哈。

相关文章

  • 唠唠“观察者模式”

    本小仙女在开发道路上渣了两年多以后,突然回过头想把以前不太理解的东西再捯饬捯饬,虽然还是很渣,但是学习还是必要的,...

  • [设计模式]唠唠依赖注入

    啥是依赖注入(Dependency injection)? 直接上例子: 这不是依赖注入! 这就是依赖注入 这也是...

  • 唠唠

    上班本来就很累,家里有个固执加野蛮的人更加累。我们都认为工作有最多不愉快的事,回到家的那个温暖的地方,一切都会烟消...

  • 唠唠

    做题做得脑袋麻木了 今天的任务还有123456……页 躺下喂个小O 趁他美梦中 刷个微博 写个日更 群里说说话 才...

  • 唠唠

    最近,总想写点什么,但又不知道从何说起。 杂乱吧,如果非要这么描述的话。匆忙,混沌,杂乱。九月份开...

  • 唠唠

    已经十几天未写东西了,倒不是偷懒,是眼睛出了点状况。 两个周以前,忽然感觉右眼不适。别说是看电脑或手机,就是看书、...

  • 唠唠

    我是一孤僻的人,喜欢独处,每天的日常无非就是非开盘时间有声书,开盘时间打开手机行情、屏幕设个永不黑屏,听歌听音乐。...

  • 唠唠

    今天是零基础训练营结束后的第一天,没有了思考题?没有了大作业,没有了群里的早安……心里空落落的,有点不适应。 我的...

  • 唠唠

    突然就有点失眠,实际上下午还胸口痛呢,晚上吃了点药,竟然睡不着。害怕影响孩子休息,我主动到书房里的破沙发上睡。我们...

  • 唠一唠

    闲来无事,便来新华书店看书了。刚坐下,有两个小男孩子,被父母安排在我的邻座与对面。 我们各自看着自己的书,一切变得...

网友评论

    本文标题:唠唠“观察者模式”

    本文链接:https://www.haomeiwen.com/subject/fspmsxtx.html