观察者模式 : 一支穿云箭,千军万马来相见

小时候一块钱就可以在录像厅看一天电影,印象里最喜欢星爷的电影,特别搞笑。

后来渐渐长大,接触了一些人和事,略微懂了他的那些苦笑、狂笑和欲哭无泪。

我喜欢的演员很多,唯独星爷,能让我看到他的照片,有种想哭的感觉。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

星爷,may the god bless you.

最近又看了遍《功夫》,其中有一幕:

095635_kASi_1771562.gif

阿星装比失败,不曾想引来了斧头帮,斧头帮老大一支穿云箭,真的是千军万马来相见,帅呆了!

095635_kWuX_1771562.gif

骨子里也是个古惑仔的我好崇拜这种场景!太帅了!那,这是怎么做到的呢?

  • 首先我得加入斧头帮,成为斧头帮一份子

  • 然后去登记,有啥事方便通知

  • 等老大一发穿云箭

  • 我跟其他小弟就赶紧出现

 

用代码实现

1. 首先定义 斧头帮老大 AxeGangBoss:

095635_xwb0_1771562.gif

斧头帮老大是消息发布者,当有情况时就调用 sendMsg(…) 方法给小弟发消息。他继承自 Java 源代码提供的 Observable :

095635_Fji6_1771562.gif

Observable 里保存着一个 Observer 的集合,然后提供了添加、删除、提醒等方法。其中重要的是 notifyObservers(…) 方法,当确定出事了(changed 为 true)时 ,挨个通知小弟。

Observer 是一个接口,规定了小弟收到消息的方法 update(…)

public interface Observer {
    void update(Observable observable, Object data);
}

2. 定义斧头帮小弟 AxeGangPeople,小弟需要按规矩来,实现 Observer 接口:

095635_8VYH_1771562.gif

3. 然后小弟去老大那登记,老大有消息了就射穿云箭:

095635_51hV_1771562.gif

4. 运行结果:

095635_hXvY_1771562.gif

这种 一对多的通知场景 就是传说中的 观察者模式

 

观察者模式

定义:

又称“发布-订阅模式”,定义了一种一对多的依赖关系,一个被观察者持有多个观察者对象的引用,当被观察者状态发生改变时,通知所有观察者进行更新。

UML 图

095635_acne_1771562.gif

  • 其中 Subject 是被观察者接口,即上文提到的 Observable ,持有一个观察者接口集合的引用,定义了观察者的添加、删除以及提醒;

  • ConcreteSubject 实现了被观察者接口,即上文的斧头帮老大 AxeGangBoss,在一定情况下提醒观察者更新;

  • Observer 是观察者抽象类,定义了更新 update 方法;

  • ConcreteObserver 是具体观察者,即上文的小弟 AxeGangPeople,重写 update 方法,进行触发操作。里面有时需要持有一个 Subject 的引用。

 

场景:

有的时候一个状态值会影响许多逻辑,比如电商类软件的位置信息,如果用户切换位置,需要显示对应城市的商品信息、活动、附件的人等等,这时使用观察者模式可以减少对应模块的代码逻辑,直接写好回调方法,等待被回调就好,耦合度降低很多。

备注:

代码地址:

https://github.com/shixinzhang/ShixinDesignPattern

作者的 csdn 设计模式总结文章

http://blog.csdn.net/column/details/zsxdesignpattern.html

转载于:https://my.oschina.net/JiangTun/blog/912985

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值