应用场景及解决问题,还有优缺点?
最近产生了一个问题,比如一个酒店的房间 会产生很多种状态,比如:有人入住,人走退房,房间脏了,空调坏了,电视坏了等等,一些状态,那么我们在代码中要实现无限的if() else吗?然也不是不可以这不过这样不利于后期维护,后期业务需求有变动的话还要改好多好多,于是想到了我们项目中常用的EventBus和RxJava还有notifyDataSetChanged();,又学习了一下它的原理,他的原理就是采用了观察者模式,观察者模式简单介绍一下,观察者模式分为观察者和被观察者,被观察者通过订阅观察者来进行时时更新,举个例子比如 警察抓小偷,警察和小偷之间就要达成这种关系,警察时观察者,小偷是被观察者,警察需要时时刻刻盯着小偷的一举一动,才保证不会错过任何有动作的瞬间,在程序里不需要这样,在程序里时时刻刻监听太浪费资源程序里可以采用订阅或者注册的方式来告诉被观察者 你的某某状态更新时告诉我,这样避免了浪费资源,又做到了最高反馈。
观察者模式的应用场景?
一个对象状态改变通知其他对象的问题和对象间一对多的依赖关系适合使用观察者模式
或
当一个对象的数据更新时需要通知其对象 ,但是这个对象又不希望和被通知的那些对象产值紧耦合的关系
一个对象的数据更新时这个对象需要让其他对象也更新自己的数据但是这个对象不知道具体有多少数据需要更新也可使用观察者模式
可以解决哪些问题?
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
当一个对象的数据更新时需要通知其对象 ,但是这个对象又不希望和被通知的那些对象产值紧耦合的关系
一个对象的数据更新时这个对象需要让其他对象也更新自己的数据但是这个对象不知道具体有多少数据需要更新也可使用观察者模式
优点:
第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。
第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,
缺点:
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。