观察者模式 - 观察者创建

Posted

技术标签:

【中文标题】观察者模式 - 观察者创建【英文标题】:Observer pattern - observer creation 【发布时间】:2013-05-05 08:30:10 【问题描述】:

我正在学习设计模式,但偶然发现了一个我真的不知道如何找到答案的问题。在观察者设计模式类图中,我看到具体的观察者通常具有对主题的引用。但是,谁设定了该参考的价值?以及如何调用附加功能?观察者是根据他们拥有的主题引用自己调用它,还是其他人设置主题然后将观察者附加到主题?我已经查找了示例,但我仍然无法找到实现此功能的最佳方法。

【问题讨论】:

【参考方案1】:

观察者是希望收到有关主题更改或事件的通知的组件。它决定观察主题并将自己添加到主题维护的观察者列表中。

典型的用例是一个包含按钮的图形面板。图形面板创建一个按钮并将其添加到自身。并且它希望每次单击按钮时都显示一个对话框。所以它将自己添加为按钮的观察者,并且按钮在被点击时通知面板。

在这个例子中,观察者创建了它观察到的对象。但在某些情况下,情况并非如此,当对主题的引用作为参数传递给其构造函数或其方法之一时。这与观察者模式本身的原理无关。

【讨论】:

谢谢。我认为这与我正在寻找的答案非常接近。【参考方案2】:

Subject 是一个对象,它控制某些事件或具有观察者感兴趣的某些属性。观察者向 Subject 注册自己以表达这种兴趣,而 Subject 保留这些注册观察者的列表。

当 Subject 的属性发生变化或感兴趣的事件发生时,Subject 会遍历其已注册的观察者列表并将更改或事件通知他们。

如何通知观察者的细节可能会有所不同。可能是他们有一个众所周知的方法被调用。可能是他们指定了他们想要调用的自定义方法,他们将其指定为注册过程的一部分。

【讨论】:

以上是关于观察者模式 - 观察者创建的主要内容,如果未能解决你的问题,请参考以下文章

PHP设计模式——观察者模式

Java观察者模式:轻松实现对象间的一对多依赖

java自带的观察者模式

观察者模式-Observer

观察者模式

设计模式之美(c++)-笔记-56-观察者模式