问题标签 [observer-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
655 浏览

.net - 如何在 ASP.NET MVC 中收集有关应用程序使用情况的统计信息?

我想收集统计信息,例如PageViews,每个用户的评论数等。我考虑过使用观察者模式。我将如何在 ASP.NET MVC 中实现这一点?

0 投票
4 回答
16363 浏览

objective-c - 我应该什么时候移除观察者?在移除观察者之前释放对象的错误

我正在尝试在我的一门课程中使用键值观察。我在 init 方法中注册了观察者并在 dealloc 中删除/取消注册它们,但是根据我的调试打印,我得到了以下错误,这似乎发生在我的 dealloc 方法被调用之前。

TekkPoint 类的实例 0x583870 正在被释放,而键值观察者仍向其注册。观察信息被泄露,甚至可能被错误地附加到其他对象上。在 NSKVODeallocateBreak 上设置断点以在调试器中停止。这是当前的观察信息:(上下文:0x0,属性:0x536400> 上下文:0x0,属性:0x55aba0>)

有没有一种特殊的方式我应该删除观察者?或者也许是我应该删除它们的特定位置?

根据这个问题,我做对了,但为什么会收到此错误消息?

这是我的dealloc例程:

需要注意的一点是,我的实现可能很奇怪,我正在从被观察者中添加和删除观察者,这会导致我的问题吗?

0 投票
14 回答
8656 浏览

c++ - 实现“观察者”模式的问题

在使用 C++ 和 STL 实现观察者模式时,我遇到了一个有趣的问题。考虑这个经典的例子:

这个例子可以在每一本关于设计模式的书中找到。不幸的是,现实生活中的系统更复杂,所以这是第一个问题:一些观察者决定在收到通知时将其他观察者添加到主题中。这使我使用的“for”循环和所有迭代器无效。解决方案相当简单——我对已注册的观察者列表进行快照并遍历该快照。添加新的观察者不会使快照失效,所以一切看起来都很好。但是这里还有另一个问题:观察者决定在收到通知时摧毁自己。更糟糕的是,一个观察者可以决定销毁所有其他观察者(它们由脚本控制),这会使队列和快照都无效。我发现自己迭代了解除分配的指针。

我的问题是,当观察者互相残杀时,我应该如何处理这种情况?有没有现成的模式?我一直认为“观察者”是世界上最简单的设计模式,但现在看来要正确实现它并不是那么容易......

谢谢大家的关注。让我们有一个决策摘要:

[1]“不要这样做”对不起,但这是必须的。观察者由脚本控制并被垃圾收集。我无法控制垃圾收集以防止它们被取消分配;

[2] “使用 boost::signal”最有希望的决定,但我不能在项目上引入 boost,这样的决定只能由项目负责人做出(我们在 Playstation 下编写);

[3] “使用 shared__ptr”这将阻止观察者解除分配。一些子系统可能依赖于内存池清理,所以我认为我不能使用 shared_ptr。

[4] “推迟观察者释放”在通知的同时将观察者排队等待移除,然后使用第二个周期将它们删除。不幸的是,我无法阻止释放,所以我使用了一种用某种“适配器”包装观察者的技巧,实际上保留了“适配器”列表。在析构函数上,观察者从他们的适配器中取消分配,然后我用我的第二个周期来销毁空的适配器。

ps 可以吗,我编辑我的问题以总结所有帖子?我是 StackOverflow 上的菜鸟...

0 投票
1 回答
7761 浏览

c# - 在 C# 中使用委托实现的观察者模式?

已经回答了一个问题,在 C# 中,观察者模式不是已经使用事件实现了吗?

它询问观察者模式是否已经在 c# 中使用事件实现。

虽然我得到了事件和观察者模式,但观察者模式真的不只是代表,事件是进一步的实现吗?

0 投票
2 回答
272 浏览

java - 使我的处理器达到峰值的方法

可能重复:
如何开始优化我的 Java 代码?- CPU 为 100%

我有一个方法 isReset() 像疯了一样执行我将它定义为

在另一个班级。下面的类是唯一使用此代码的类。

0 投票
3 回答
628 浏览

language-agnostic - 多事件监听器的设计

我熟悉标准听众,尤其是。在爪哇。例如,如果您有一个对象集合,它可能支持一组不同事物的侦听器:CreateListener、ChangeListener、DeleteListener。每个都有一个方法(例如 objectChange),它被传递一个受影响对象的列表。使用此集合的应用程序可以通过实现和注册侦听器来注册对其中一个或多个的兴趣。当集合中的对象发生事情时,将调用适当的侦听器。

但是,如果有许多这样的事件类型,可能相似但有些不同。而是定义一个具有许多方法的侦听器类是否有意义。例如:

对于想要注册其中许多事件的应用程序来说,这似乎更容易——它们在一个类中实现了许多方法,而不是定义许多类,每个类只实现一个方法。有什么缺点或其他建议吗?

澄清编辑:(对不起,我对假期分心了,不确定这是否应该是一个单独的帖子,但似乎有必要跟进这个帖子)

我应该指定此代码将以多种语言实现,作为客户端应用程序将使用的框架。对于 C++,实现多个接口很困难。

超集抽象侦听器可以为每个方法提供默认的无操作实现,因此扩展它的客户端只需覆盖他们关心的那些。使用这种方法,我们稍后可以决定向抽象类添加额外的方法,并且现有的客户端就可以了(并且可以在他们选择时覆盖这些新方法)。一次调用只需要一次注册,而不是许多注册方法的替代方案(应用程序调用一个或多个)。

有了这个澄清,超集抽象类是否比单个抽象类更有意义?

0 投票
3 回答
670 浏览

java - 在 OOP 中添加/注册按钮侦听器的样式(Java、Actionscript 等)

在 UI 中添加按钮侦听器时,我遇到了 2 种不同的样式。我以 SWT 为例。但尽管如此,我在 J2ME、Flash Actionscript 中也看到了类似的代码。

风格一:

风格2:

我个人更喜欢第二种风格,因为它为我提供了一种集中处理鼠标事件的方式。你更喜欢哪种风格?为什么?

0 投票
2 回答
4158 浏览

java - Java中观察者模式和泛型的问题

我已经制作了一个通用的 Observer 接口和一个 Observable 类,但由于一些泛型问题而无法编译我的类。我不知道为什么我试图做的事情是被禁止的。代码如下:

0 投票
9 回答
8908 浏览

soa - 最佳发布/订阅“中间件”

我在市场上寻找一个好的基于开源网络的 Pub/Sub(观察者模式)库。我还没有找到我喜欢的:

  • JMS - 与 Java 绑定,将消息内容视为哑二进制 blob

  • NDDS - $$,使用 IDL

  • CORBA/ICE - Pub/Sub 建立在 RPC 之上,CORBA API 不直观

  • JBOSS/ESB——不太熟悉

如果这样的包可以做到以下几点,那就太好了:

  • 基于网络

  • 了解有效载荷数据,用户不必担心字节序/序列化问题

  • 多语言支持(C++、ruby、Java、python 会很好)

  • 没有自动生成的代码(没有 IDL!)

  • 直观的订阅/主题管理

为了好玩,我创建了自己的. 想法?

0 投票
2 回答
1608 浏览

c# - 观察者模式或数据绑定

我的问题是,您会实现观察者模式,还是使用数据绑定来执行以下操作:

目前,我正在初始化 GuiDataObj 的列表。当触发事件时,我查找 GuiDataObjById 并修改对象,该对象数据绑定到 GuiElement;它更新了 GUI。

有几个 GuiElement(目前都是同一类型,但将来可能会改变),我希望能够修改一个类对象,并让 GuiElement 自动神奇地更新 GuiElement 反映的变化.

然后让我的 GuiElement 在收到更改通知时更新 Gui?

如果我实现数据绑定而不是通知观察者更改,它会是一个更灵活的设计吗?我想我真正要问的是,什么是可视化表示业务对象的最灵活的方式,它会不断地实时更新。

替代文字 http://devpupil.net/GuiConcept.PNG