一、概念
一对多的消息通知机制
1.1、定义
对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
- Subject,观察目标:
关键在于维护Observer列表,消息分发顺序以及如何快速的分发消息 - Observer,监听者:
关键在于指定需要观察目标的哪些变化,以及指定变化发生的回调接口
1.2、解决的问题
问题分析:实际项目需求中,存在这对多广播的场景,即发布一个消息希望相关所有人都能及时得到通知。也就是说,一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
模式的解决思路:模式抽离出 Observer观察者抽象基类,定义通知接收入口;设计观察目标的基类Subject,它负责注册保存所有希望监听该观察目标的监听者 Observer;依次模拟广播的实现机制。
应用和优缺点
二、模式的应用和优缺点
2.1、应用场景
- 实例:
iOS的KVO和Notification机制
2.2、优缺点
优点:
1、建立一对多的消息传递机制
2、观察者和被观察者是抽象耦合的缺点:
1、观察者太多,消息的传递时间增加,效率降低;特别是如果变化太过于频繁,消息会堵塞。
2、如果在观察者Observer和被观察者Subject之间,存在有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
三、思而后行
- 思考观察者太多,消息分发效率降低的解决方案?
- 如何维护消息的分发顺序?
- 思考如何避免循环引用?