Fork me on GitHub

大战设计模式【2】—— 观察者模式

观察者模式(observer)

观察者模式使用的例子

https://github.com/LinkinStars/DesignPatternsAllExample

observer—|

                 |—nonuse不使用观察者模式的例子

                 |—use使用观察者模式的例子

 

一、定义

定义对象之间的一种一对多依赖关系,使得当每一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

 

二、结构

Subject(抽象目标):又称为主题,是被观察的对象。

ConcreteSubject(具体目标):抽象目标的子类,通常包含有经常发生改变的数据,当它的状态发生改变时,向其各个观察者发出通知。

Observer(抽象观察者):观察者将对观察目标的改变做出反应。

ConcreteObserver(具体观察者):具体观察者中维持一个指向具体目标对象的引用,它用于存储具体观察者的有关状态,这些状态需要和具体目标地状态保持一致。

 

三、优点

可以实现表示层和数据逻辑层的分离,观察者和目标是松耦合的

支持广播通信,观察目标会向已注册的观察者对象发送通知

增加新的观察者无须修改原有系统代码

 

四、缺点

如果一个观察目标有很多直接和间接的观察者,所有观察者收到通知会花费大量时间

如果观察者和观察目标之间存在循环依赖,可能导致系统崩溃

如果忘记删除不必要的订阅者,那么容易误发送消息

 

五、应用场景

一个抽象模型有两个方面,其中一个方面依赖于另一个方面,封装起来使其独立改变和复用

一个对象的改变将导致一个或多个其他对象也发生改变,但并不知道具体有多少个对象将要发生改变当

一个对象必须通知其他对象,但是你又希望这个对象与被通知的对象是松耦合的

 

六、个人总结

1、通过微博的例子理解观察者模式,如果你使用过微博,那么观察者模式你可以直接理解为多个粉丝关注同一个明星的微博   

当明星发送微博(目标发送消息),所有关注的人都会收到消息(所有订阅的观察者都能收到消息)   

收到的微博是一样的。(所有观察者收到的消息是一样的)   

如果取消关注,那么就收不到消息(观察者取消订阅目标之后就不能收到消息),可以随时关注随时取消   

明星不需要知道有多少人关注,只要发送微博就行(目标不需要知道有多少人订阅)

 

2、观察者模式有两种方式   

第一种,推送模式,目标向观察者主动推送消息       

优点:获取消息及时,一有消息变动就会被观察者直接知道       

缺点:观察者不需要一些消息的时候,会被迫收到很多不必要的信息   

 

第二种,获取模式,观察者向目标获取消息       

优点:需要就获取,不需要就不获取,灵活一些       

缺点:如果不获取,那么消息就不会被知道

 

3、观察者模式和别的模式有关系(之后更新)





参考博客:http://www.cnblogs.com/edisonchou/p/7242622.html
posted @ 2017-09-28 13:46  LinkinStar  阅读(543)  评论(0编辑  收藏  举报