一、绪
上一篇博客从状态模式角度分析了App如何巧妙的实现登录功能。今天继续和大家分享一个有意思也是很经典的设计模式:观察者模式。
观察者模式又叫发布-订阅模式。它定义了一种对象间一对多的依赖关系。使得每当一个对象状态发生改变,所有依赖它的对象都会得到通知并自动更新。本篇内容仍然会结合实战来分析设计模式的用途。ok,废话少说。开车~
二、介绍
观察者模式使用场景也非常多。Android的广播接收器:BroadcastReceiver,ListView的Adapter方法notifyDataSetChanged(),开源的第三方库事件总线:EventBus等等都使用了观察者方式巧妙解决了耦合性问题。
三、观察者模式的定义
(1)抽象目标(被观察者)
(2)具体目标
(3)抽象观察者
(4)具体观察者
在4种结构中,抽象目标和抽象观察者之间存在关联关系。
四、简例
猫叫,老鼠就跑 是观察者模式的一个典型的案例。在这个案例中,我们可以很容易的看出,猫叫了,老鼠就跑。也就是猫作为被观察者,老鼠作为观察者,当猫发出声音,即通知老鼠跑的行为方式。
1.抽象目标:定义了存放观察者的集合,以及增加和删除操作。并且提供了通知方法,延迟到子类实现。
2.具体目标(被观察者):实现通知方法,在通知方法中遍历集合,通知观察者刷新行为。
3.观察者:定义行为方式。
4.具体观察者:实现具体的行为方式。
由上述代码可以清晰的发现,观察者模式的核心在于:
(1)观察者提供行为方式的实现。
(2)目标(被观察者)注册观察者
(3)被观察者触发通知,遍历已注册的观察者
(4)观察者收到通知,执行具体行为操作。
(5)利用抽象层次类实现可扩展性,降低耦合。
五、实战使用技巧
1.定义观察者接口
2.定义辅助类
3.定义具体的Fragment
4.Activity通知刷新
分析:
(1)定义了观察者抽象接口,并声明行为方法。
(2)定义辅助类,辅助类中定有了对于观察者的操作。
(3)在具体的观察者中,将本身添加到集合。这里是有set,避免添加多个重复。
(4)在Activity中通知刷新。
上例中可以看到,Activity基本没有和Fragment有耦合。其实现在很多优秀的开源库已经为我们提供了解决方案,例如EventBus。同样利用观察者模式解决了组件间通信的问题。
六、小结
最后再来看看优缺点:
优点:观察者模式使得观察者和被观察者之间以抽象耦合的方式存在。增强系统的可扩展性,灵活性。
缺点:因为通知观察者的方式是遍历顺序执行,需要我们在使用时考虑一下执行速度和效率问题。如果会有所影响,建议使用异步方式通知观察者。
以上就是关于观察者模式的内容,具体的使用还需要大家在实战中慢慢体会。