观察者模式 - 变种

时间:2012-03-13 04:22:01

标签: c++ design-patterns

观察者模式: 它有两种变体。

  1. 当受试者将所有观察者告知事件发生的时间
  2. 如果发生事件,观察者可以查询主题。
  3. 我正在考虑适用于选项2的任何实际示例?

    我已经在我的一个项目中使用了选项1,其中有任何特定事件(在我的套接字上),所有为该事件注册的观察者都会收到通知。

3 个答案:

答案 0 :(得分:2)

第二个版本根本不是观察者。那只是轮询。

设计模式书中实际描述的内容,以及您的意思是:

  1. 每当主题发生变化时,更改的值都会被推送到观察者(作为'notify'调用的参数)。
  2. 每当主题发生变化时,观察者会根据需要从主题中拉出新状态(“通知”调用没有参数)。
  3. 第二种方法的用例:

    主题是一组地址簿记录。每当更新地址簿时,都应通知观察员。但是,更改的数据量可能相当大,并且每个观察者都不需要所有数据。因此,不是推送所有数据,而是通知所有观察者(可能将主题的'this'指针作为参数传递,以防观察者应该能够立即收听多个主题),然后通过getter提供新状态 - 这样,每个观察者只能获取所需的信息。就像更新GUI中“地址数”字段的观察者一样 - 它对实际名称不感兴趣,只对项目数量感兴趣。

答案 1 :(得分:0)

我认为并非所有主题事件都被观察者所感兴趣,所以如果使用“推”,一些观察者可能不需要知道事件,但使用“拉”,观察者知道他们想要得到什么。

答案 2 :(得分:0)

考虑移动电子邮件客户端。您可以将数据推送到手机(推送),或者只有在检查邮件时才能收到电子邮件(拉)。你问的是后来的情况。通常,这些是您在设置或编辑帐户时可以配置的选项。

另一个例子......

触发了ajax网络请求。如果您在网页上有一个仅在刷新页面时更新的天气应用程序,或者事件发生时,此页面/应用程序正在从服务器提取数据。另一方面,您可以使用像Pusher App这样的服务,它可以将数据推送到您的页面/应用程序以进行实时更新。

拉取数据可让您的观察者独立,但仍然可以获得Observable的支持。