大战设计模式【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