3.5 观察者模式
观察者模式提供一种方法来使对象“监听”其他对象,而不需要修改任何数据服务器。这意味着传感器数据能够很容易地分享给其他元素,当编写传感器代理时,元素可能甚至还不存在。
3.5.1 抽象
观察者模式(“发布-订阅模式”)通知一组感兴趣的客户相关数据已经改变。它不需要数据服务器对客户有任何先验信息,而客户仅提供订阅功能,允许客户在通知列表中动态添加(或删除)其本身。数据服务器可以执行各种通知策略,最常见的是当新数据到达时发送数据,同时客户也能定期更新。
3.5.2 问题
在理想状态下,当数据已经改变时,每个客户都能够定期从数据服务器获取数据,但这造成计算浪费;而且客户通常不知道新数据何时可用,造成通信资源浪费。如果数据服务器推送数据,那么它必须知道其所有客户,打破常规客户机-服务器关系需要改变服务器,添加新的客户。
3.5.3 结构模式
如下图所示,AbstractSubject添加维护感兴趣订阅者类列表机制的数据服务器。通过传递指向accept(Datum)函数的指针,客户自己添加进入通知列表,并且通过使用相同的指针调用取消订阅从列表中删除。当AbstractSubject决定通知它的客户时,notify()函数遍历客户列表,调用指向函数,传递相关数据。AbstractClient提供accept(Datum)函数接收和处理进入的数据。