观察者模式是最常见的模式之一。这种模式提供一种方法来时对象“监听”其他对象,而不需要修改任何数据服务器。在嵌入式领域,这意味着数据能够很容易分享给其他元素。
观察者模式不需要数据服务器对它的客户有任何信息,只需要客户提供订阅功能,允许客户在通知列表中动态添加、删除其本身。数据服务器在数据刷新后通过遍历通知列表将新数据发送给每一个客户,也可以定期更新给客户,减小了客户的计算负担,并确保了数据的实时性。
在理想情况下,当数据发生改变时,每个客户希望能及时获取到数据,但通过一直查询的方法会导致计算资源和通信资源的浪费。如果数据服务器推送数据,那么必须知道其他所有客户,打破了常规的客户-服务器关系。因此可以通过在数据服务器中添加订阅和取消订阅的方式解决这个问题。客户能够动态的将自己添加到通知列表中,服务器根据通知列表来通知客户数据发生更新。
观察者模式主要有以下几种协作角色:
抽象客户接口
该接口与数据服务器相关联,以便于它能够调用数据服务器的各种服务。它主要包括accept(datanum)即数据接收函数,当它订阅或数据服务器发送数据时调用该函数。
除了使用函数接收数据外,也可以直接关联数据,可以通过指针、栈、全局变量或静态变量等来实现。
抽象数据服务器接口
它主要提供与该模式相关的3个服务。
subscribe(acceptPtr):服务器通知列表添加指向接收函数的指针。
unsubscribe(acceptPtr):从服务器删除对应的接收函数指针。
notify():遍历通知列表来通知订阅的客户。
数据服务器也包括一个用于记录数据的变量datanum,能够以堆、栈或合适的静态方式实现。以及NotificationHandles列表,该列表记录了要通知的客户的,可以使用指针数组或是链表等其他数据结构实现。
ConcreteClient(实际客户端)
是具体的抽象客户接口的实现,也就是提供acceptPtr(datanum)函数的实现,以及其他和本模式不相干的功能。
ConcreteSubject(实际服务器)
是抽象数据服务器的具体实现,它不仅提供抽象服务器的具体函数实现,而且提供获取和管理它发布的数据的方法。它通常也可以是硬件代理(见硬件代理模式)。
NotificationHandle
是存储客户接收函数指针的类,通常是指针数组,也可以是其他数据结构。
硬件代理模式是给一组在设计时还不明确的客户分发数据的过程,并在运行时动态的管理感兴趣的客户列表。该模式维护基本的客户机-服务器关系,并且通过订阅机制提供运行时的灵活性。因为客户仅在需要的时候更新数据,最常见的就是在数据刷新时调用客户函数。
另外,该模式也能够自由的与硬件代理或硬件适配器模式组合。