gpt4 book ai didi

java - 事件通知: Java design patten

转载 作者:行者123 更新时间:2023-12-01 18:33:37 25 4
gpt4 key购买 nike

我正在开发一个包含多个模块的项目。我有一个位于基础的模块,并且对所有模块都是通用的。我在基本模块中有一个业务对象(这是单例类),这可以触发一个已完成某事的事件。

我希望每个模块都能够监听这个事件并做一些特定的事情。

最好的方法是什么?

公共(public)模块是应用程序启动时执行的第一个代码,因为它是基础,所以无法调用其之上的模块。

编辑:考虑到我的情况,我认为这个问题有些不完整。下面是解释。

我有一个单例类(我将其设为不可变)。该类存在于基本模块中。它有一个静态方法getInstance(),它将根据表中存储的数据初始化一个新对象。有一个后台调度程序,它将定期使用服务器上的最新数据更新该表中的数据。目前我正在做的是调度程序直接与表交互。1. 我不希望有任何外部访问该数据。我正在考虑在单例类中提供静态方法,例如

protected static void doPeriodicUpdate() {
}

并从后台调度程序调用此方法,例如

MySingleTonClass.doPeriodicCheck();

使用静态方法是个好方法吗?

单例类可以随时触发一些事件,例如

1. MyEventOne
2. MyEventTwo

监听这些事件的监听器将获得mysingletonclass对象的句柄,并执行一些特定的功能。当这个对象被创建时,它只会在 tomcat 关闭时被销毁。在 tomcat 启动时,我有一个 init servlet,它初始化这个单例对象并将其放入 servlet 上下文中,以便任何需要该对象的类都可以访问它。当发生某些事情时,这些事件将被触发,之后我必须更新表。为此,我还计划在单例类中使用静态方法,例如

protected static void doSomething(String arg0) {
// This will do something on database
// After completion
fireMyEventOne();
}

// Something happened at client side. Client will call the rest service and rest service will call static method like

class MyRestService extends MySingleTonClass {
MySingleTonClass.doSomething();
}

像这样,当客户端发生其他事情时,可以触发其他事件。客户端将以同样的方式调用休息服务。

我感觉这种做法有问题。如有任何建议,我们将不胜感激。

最佳答案

查看 Google's Guava library 中包含的事件总线。它的设计几乎完全适合您的用例:应用程序的一个部分触发一个事件,而另一个部分订阅这些事件,而这两个部分不必相互了解(如果您通过以下方式解决它,通常会出现这种情况)在基本模块上注册外部模块的事件处理程序)。

我认为他们的示例很好地展示了使用该库的感受:

// Class is typically registered by the container.
class EventBusChangeRecorder {
@Subscribe public void recordCustomerChange(ChangeEvent e) {
recordChange(e.getChange());
}
}

// somewhere during initialization
eventBus.register(new EventBusChangeRecorder());

// much later
public void changeCustomer() {
ChangeEvent event = getChangeEvent();
eventBus.post(event);
}

在您的情况下,您的基本模块将是发布到事件总线的部分,而其他模块将具有用 @Subscribe 注释的方法。您需要确保的是模块可以共享事件总线的一个实例,例如,您可以通过在基本模块中创建它,然后允许其他模块访问它来实现这一点。

关于java - 事件通知: Java design patten,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23021154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com