观察者模式

来源:互联网 发布:李成儒饰演淘宝电视剧 编辑:程序博客网 时间:2024/06/04 01:19

在《headfirst》一书中说:出版者+订阅者=观察者模式。

观察者模式的定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

该模式的主要目的就是解耦,让数据的主模块与关心数据变化的模块分离,降低他们之间的粘合度。其次,该模式可以让功能框架更加清晰,方便系统的维护。

模式结构图如下(来自《GOF设计模式》):

该模式主要分为“推”和“拉”两种模型。

推模型:目标向观察者发送关于改变的信息,而不关心它们需要与否。缺点:每次都会向所有观察者推送数据,可能会出现不必要的推送,造成冗余。

拉模型:目标只通知观察者改变,改变的信息由各个观察者去目标获取。缺点:观察者需要确定是哪条数据发生了改变,且要调用目标的获取数据的接口,增加了耦合度。

该模式还有一个点需要注意的就是何时出发Notify函数。

第一种情况:在目标内部数据发生改变时调用。当目标有多个数据时,任意一个改变可能都会出发,具体的出发策略可以按需设定。

第二种情况:由客户主动调用。可以保证在合适的时间进行触发,但是同时也给客户增加了负担。

以上情况都要视具体情况而定。

实现(简单的实现了推模型):https://code.csdn.net/snippets/2597707


扩展:在游戏服务器框架中经常会出现观察者模式或其变种。例如:服务器基本功能模块”触发器”,还有服务器的消息机制。都是通过注册监听,然后改变触发等过程来实现

的。