问题标签 [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 投票
6 回答
25333 浏览

java - 我应该使用监听器还是观察器?

我的 GUI 中有一个下拉框,它显示另一个类中 ArrayList 的内容。新对象可以在 GUI 的其他地方添加到 ArrayList,所以我需要知道它什么时候更新,所以我可以刷新下拉菜单。据我所知,我的两个选择是扩展 ArrayList 类以允许我向其中添加自己的 changeListener,或者使包含相关 ArrayList 的类扩展可观察。

哪个是更合适的解决方案?

0 投票
2 回答
4443 浏览

actionscript-3 - 如何修改现有的 AS3 事件以便可以传递数据?

所以我想要一种设置事件的方法,这样我就可以在不创建闭包\内存泄漏的情况下传递数据。据我所知:

这让我有以下行为:

我的目标是获取我想要传递的自定义数据,以便从事件闪光触发中传递,而不仅仅是我触发的那个。例如,如果我想传递一个movieclip 和一个loader.COMPLETE 事件来放入生成的位图怎么办?

0 投票
16 回答
4174 浏览

c# - 您如何用初学者语言描述观察者模式?

目前,我的理解水平低于网络上所有关于观察者模式的编码示例。我将其理解为几乎是一个订阅,当委托注册的更改发生时,它会更新所有其他事件。但是,我对好处和用途的真正理解非常不稳定。我做了一些谷歌搜索,但大多数都超出了我的理解水平。

我正在尝试用我目前的家庭作业来实现这种模式,并且要真正理解我的项目需要更好地理解模式本身,也许还需要一个例子来了解它的用途。我不想将这种模式强加于提交,我需要了解其目的并相应地开发我的方法,以便它实际上服务于一个好的目的。我的文字并没有真正深入,只是一句话提到它。MSDN 对我来说很难理解,因为我是这方面的初学者,而且它似乎更像是一个高级主题。

您如何向初学者描述这种观察者模式及其在 C# 中的用途? 例如,请保持代码非常简单,这样我就可以比复杂的代码片段更能理解其目的。我试图通过一些简单的文本框字符串操作和使用委托来有效地使用它,所以指针会有所帮助!

0 投票
4 回答
550 浏览

c# - 观察者模式和委托

我需要帮助来理解观察者模式和代表。我在另一个网站上找到了这段代码,我试图了解它实际上在做什么。有人可以帮我吗。

当我执行代码时,我收到两条消息“服务器已启动并正在运行”和“服务器已关闭,我们正在处理它,它很快就会回来”。我想我收到了两条消息,因为在 Main 中有一个 server.ServerStatus = true; 和 server.ServerStatus = false。但是,如果我注释掉 server.ServerStatus = true; 然后运行我得到消息“服务器已启动并正在运行”,但我预计只会看到“服务器已关闭,我们正在处理它,它很快就会回来。”。有人可以解释吗?苏珊

0 投票
3 回答
3803 浏览

c++ - 观察者模式的线程实现 - C++

我正在开发一个 C++ 程序,它有一个“扫描”方法,它将触发一个运行相对较长的扫描过程。当该过程完成时,scan 方法将使用观察者模式通知观察者结果。

我想为每次扫描创建一个单独的线程。这样我可以同时运行多个扫描。当每个扫描过程完成时,我希望 scan 方法通知侦听器。

根据 boost 线程库,看起来我可以做这样的事情:

这看起来大致正确吗?我是否需要对侦听器的呼叫进行互斥?可以摆脱连接吗?

0 投票
4 回答
5832 浏览

.net - 观察者模式与事件驱动模型有何不同?

我是一名高级开发人员,但我没有接受过大量的正式培训,虽然我使用过很多设计模式,并且在我作为开发人员的这些年看到它们使用过,但没有人真的特意去说。“哦,这是一个观察者模式,或者这是一个单例模式。”

阅读了一些设计模式,我遇到了观察者模式,它似乎与 .NET 框架事件的工作方式非常相似。我错过了一些基本的东西吗?

0 投票
4 回答
612 浏览

design-patterns - 如何处理基于消息类型的不同处理?

我有一个进程,它有一个“通知”方法,它接收消息类型的基类作为参数。我想根据派生的消息类型进行不同的处理。这是否意味着我需要添加一个名为“process”或类似于消息类型的方法,并使用多态调用它?为每种特定的消息类型添加“通知”会更好吗?

更多细节:语言是 C++。我认为 notify 在这里是个好主意,因此我只需要一种方法来通知各种消息类型。控制器从指定纯虚拟通知(MsgBaseClass)方法的侦听器类继承。我仍然喜欢这个想法,因为我不必为每种新消息类型添加通知。但是在控制器代码本身中,除了动态转换或向消息添加消息类型之外,我没有看到任何区分消息类型的方法。

编辑:我想我将使用访客模式。它允许我只保留一种通知方法,并且我可以避免在我的代码中使用 switch 语句。“访问者”接口将指定侦听器处理各种派生消息类型所需的各种方法。这将只需要将一条消息添加到 Message 基类,即纯虚拟“accept(MyMessageTypeVisitor v)。派生的消息类将使用 v.visit(this); 来实现它。

认为这应该可行。

0 投票
5 回答
17936 浏览

c# - C# 插件架构与插件之间的接口共享

我将我的问题分为短版和长版,供手头时间不多的人使用。

简洁版本:

我需要一些具有提供者和消费者插件的系统架构。提供者应该实现接口 IProvider,消费者应该实现 IConsumer。执行应用程序应该只知道 IProvider 和 IConsumer。消费者实现可以询问正在执行的程序集(通过 ServiceProcessor)哪些提供者实现了 InterfaceX 并获取一个 List。这些 IProvider 对象应该被强制转换为 InterfaceX(在消费者中),以便能够将消费者挂钩到 InterfaceX 定义的某些事件上。这将失败,因为执行程序集不知何故不知道此 InterfaceX 类型(转换失败)。解决方案是将 InterfaceX 包含到插件和执行程序集都引用的某个程序集中,但这应该意味着对每个新的提供者/消费者对都进行重新编译,这是非常不受欢迎的。

有什么建议么?

长版:

我正在开发某种通用服务,它将使用插件来实现更高级别的可重用性。该服务由某种使用提供者和消费者的观察者模式实现组成。提供者和消费者都应该是主应用程序的插件。让我首先通过列出我的解决方案中的项目来解释服务是如何工作的。

项目 A:用于托管所有插件和基本功能的 Windows 服务项目。TestGUI Windows 窗体项目用于更轻松的调试。来自项目 B 的 ServiceProcessor 类的一个实例正在执行与插件相关的工作。该项目的子文件夹“Consumers”和“Providers”包含子文件夹,其中每个子文件夹分别包含一个消费者或提供者插件。

项目 B:一个类库,包含 ServiceProcessor 类(执行插件之间的所有插件加载和调度等)、IConsumer 和 IProvider。

项目C:一个类库,链接到项目B,由TestConsumer(实现IConsumer)和TestProvider(实现IProvider)组成。TestProvider 实现了一个附加接口(ITest,它本身是从 IProvider 派生的)。

这里的目标是消费者插件可以询问服务处理器它有哪些提供者(至少实现 IProvider)。返回的 IProvider 对象应在 IConsumer 实现中强制转换为它实现的其他接口 (ITest),以便使用者可以将事件处理程序挂钩到 ITest 事件。

项目 A 启动时,会加载包含使用者和提供者插件的子文件夹。以下是我迄今为止遇到并试图解决的一些问题。

ITest 曾经驻留在项目 C 中的接口,因为这只适用于 TestProvider 和 TestConsumer 知道的方法和事件。总的想法是保持项目 A 简单,不知道插件之间的作用。

使用项目 C 中的 ITest 以及将 IProvider 转换为 ITest 的 TestConsumer 的 Initialize 方法中的代码(当实现 ITest 的对象被称为 IConsumer 对象时,这在单个类库本身中不会失败)会发生无效的转换错误. 可以通过将 ITest 接口放入项目 A 引用的项目 B 中来解决此错误。这是非常不需要的,因为我们需要在构建新接口时重新编译项目 A。

我试图将 ITest 放在仅由项目 C 引用的单个类库中,因为只有提供者和消费者需要了解此接口,但没有成功:加载插件时,CLR 指出找不到引用的项目。这可以通过挂钩当前 AppDomain 的 AssemblyResolve 事件来解决,但不知何故这似乎也不需要。ITest 再次回到项目 B。

我试图将项目 C 拆分为消费者和提供者的单独项目,并且都加载本身运行良好的程序集:两个程序集都驻留在 Assemblies 集合或当前 AppDomain 中:发现程序集:Datamex.Projects.Polaris.Testing.Providers ,版本=1.0.0.0,文化=中性,PublicKeyToken=2813de212e2efcd3 发现程序集:Datamex.Projects.Polaris.Testing.Consumers,版本=1.0.0.0,文化=中性,PublicKeyToken=ea5901de8cdcb258

由于消费者使用提供者,因此消费者对提供者进行了引用。现在再次触发 AssemblyResolve 事件,说明它需要以下文件:AssemblyName=Datamex.Projects.Polaris.Testing.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2813de212e2efcd3

我的问题:为什么会这样?这个文件已经加载对了吗?为什么从 IProvider 转换到我知道它实现的某个接口是不可能的?这可能是因为执行程序本身不知道这个接口,但是这个不能动态加载吗?

我的最终目标:消费者插件询问 ServiceProcessor 它有哪些提供者实现了接口 x。提供者可以被强制转换为这个接口 x,而无需执行程序集知道接口 x。

有人可以帮忙吗?

在此先感谢,埃里克

0 投票
4 回答
875 浏览

ruby-on-rails - Ruby on Rails 项目需要过滤器/观察器的替代品

Rails 有一组很好的过滤器(before_validation、before_create、after_save 等)以及对观察者的支持,但我面临的情况是,依赖过滤器或观察者在计算上过于昂贵。我需要一个替代方案。

问题:我正在记录对大量页面的 Web 服务器点击。我需要的是一个触发器,它会在给定页面的浏览次数超过 X 次时执行操作(例如,发送电子邮件)。由于页面和点击量巨大,使用过滤器或观察器会浪费大量时间,因为 99% 的时间,它测试的条件都是错误的。电子邮件不必立即发送(即可以接受 5-10 分钟的延迟)。

相反,我考虑的是实现某种流程,每 5 分钟左右扫描一次数据库,并检查哪些页面被点击超过 X 次,在新的数据库表中记录该状态,然后发送相应的电子邮件。它并不完全优雅,但它会起作用。

还有其他人有更好的主意吗?

0 投票
3 回答
8551 浏览

java - 我是否应该在 Web 应用程序的 Java bean 中添加对 PropertyChangeSupport 和 PropertyChangeListener 的支持?

我注意到有些人编写的 bean 支持 Property Change 观察者模式。

然而,我记得读到观察者模式在基于 Web 的 MVC 模式中并不常用,因为 Web 应用程序的无状态特性。

在Web 应用程序Java bean中遵循上述模式是一种好习惯吗?