一、什么是观察者模式
1.1观察者模式的概念
观察者模式(observer pattern)是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
在观察者模式中,主题(subject)是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者(observer)订阅并接收通知。
1.2观察者模式的使用场景(好处)
当我们面对:一个对象的状态发生了改变,需要通知到某一些对象的时候,我们可以考虑使用观察者模式。在观察者模式中,一个对象(subject)的状态发生改变,所有依赖的对象(observer)都将得到通知,进行广播通知。
观察者模式使用面向对象技术,将subject和observer之间的依赖关系弱化,具有易用性,且低耦合,又可以保证良好的协作关系。
举例1:在拍卖会上,拍卖师知悉当前的最高竞价,最高竞价发生变化时,通知相关联的竞价者。
举例2: 对同一组数据进行统计分析时候, 我们希望能够提供多种形式的表示 (例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。这些表示都依赖于同一组数据, 我们当然需要当数据改变的时候, 所有的统计的显示都能够同时改变。 Observer 模式就是解决了这一个问题。
缺点:1.当一个subject有大量直接或间接的observer时,广播通知所有的观察者需要花费很多的时间;2.在subject和observer之间如果有循环依赖的话,会造成循环调用,对系统有很大的隐患;3.观察者模式没有相应的机制让观察者知道所观察的对象是如何发生变化的。
举例:在拍卖会上,拍卖师知悉当前的最该竞价,最高竞价发生变化时,通知相关联的竞价者,而来参与竞价的竞价者只是一个小萝莉(小罗罗),他还要汇报他的上级;而其中有一个竞价者他和拍卖方是勾结的,就是铁了心要拍下,但是拍卖师没有告诉大家最高竞价是多少.....。
二、观察者模式的C++实现
观察者模式的实现首先需要对suject和observer定义基类,基类定义为存虚类,如图2.1所示。
图2.1 subject、observer虚基类然后在具体的观察者与被观察者类中将纯虚函数实现。
图2.2 基类的具体实现
网友评论