以 “猫叫,老鼠就跑” 带你了解观察者模式



一、绪


上一篇博客从状态模式角度分析了App如何巧妙的实现登录功能。今天继续和大家分享一个有意思也是很经典的设计模式:观察者模式。

观察者模式又叫发布-订阅模式。它定义了一种对象间一对多的依赖关系。使得每当一个对象状态发生改变,所有依赖它的对象都会得到通知并自动更新。本篇内容仍然会结合实战来分析设计模式的用途。ok,废话少说。开车~


二、介绍


观察者模式使用场景也非常多。Android的广播接收器:BroadcastReceiver,ListView的Adapter方法notifyDataSetChanged(),开源的第三方库事件总线:EventBus等等都使用了观察者方式巧妙解决了耦合性问题。


三、观察者模式的定义


观察者模式属于行为型设计模式。它的结构分为4种:

(1)抽象目标(被观察者)

(2)具体目标

(3)抽象观察者

(4)具体观察者

在4种结构中,抽象目标和抽象观察者之间存在关联关系。

 


四、简例


猫叫,老鼠就跑 是观察者模式的一个典型的案例。在这个案例中,我们可以很容易的看出,猫叫了,老鼠就跑。也就是猫作为被观察者,老鼠作为观察者,当猫发出声音,即通知老鼠跑的行为方式。

 

1.抽象目标:定义了存放观察者的集合,以及增加和删除操作。并且提供了通知方法,延迟到子类实现。

 

2.具体目标(被观察者):实现通知方法,在通知方法中遍历集合,通知观察者刷新行为。

 

3.观察者:定义行为方式。


4.具体观察者:实现具体的行为方式。

 

由上述代码可以清晰的发现,观察者模式的核心在于:

(1)观察者提供行为方式的实现。

(2)目标(被观察者)注册观察者

(3)被观察者触发通知,遍历已注册的观察者

(4)观察者收到通知,执行具体行为操作。

(5)利用抽象层次类实现可扩展性,降低耦合。


五、实战使用技巧


想象一个场景,在App首页有3个切换的Fragment。第二、三个Fragment中有商品收藏记录展示。当在商品详情Activity中点击收藏后,此时Fragment要进行刷新。此时想必大家想到的方式就是使用接口回调。在Fragment中定义接口。Activity实现接口方法。这样也是可以解决需求,但是Activity和Fragment产生了不必要的强耦合关系。所以我们可以想到利用观察者模式来解决。

1.定义观察者接口

  

2.定义辅助类

 

3.定义具体的Fragment

 

4.Activity通知刷新

 

分析:

(1)定义了观察者抽象接口,并声明行为方法。

(2)定义辅助类,辅助类中定有了对于观察者的操作。

(3)在具体的观察者中,将本身添加到集合。这里是有set,避免添加多个重复。

(4)在Activity中通知刷新。

上例中可以看到,Activity基本没有和Fragment有耦合。其实现在很多优秀的开源库已经为我们提供了解决方案,例如EventBus。同样利用观察者模式解决了组件间通信的问题。


六、小结


最后再来看看优缺点:

优点:观察者模式使得观察者和被观察者之间以抽象耦合的方式存在。增强系统的可扩展性,灵活性。

缺点:因为通知观察者的方式是遍历顺序执行,需要我们在使用时考虑一下执行速度和效率问题。如果会有所影响,建议使用异步方式通知观察者。

以上就是关于观察者模式的内容,具体的使用还需要大家在实战中慢慢体会。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Songlcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值