首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件通知: Java设计模式

事件通知: Java设计模式
EN

Stack Overflow用户
提问于 2014-04-12 03:33:19
回答 1查看 377关注 0票数 0

我正在从事一个项目,其中有几个模块。我有一个模块,这是在基础上,这是所有模块的共同。我在基本模块中有一个业务对象(这是一个单例类),它可以触发一个事件,表明已经做了一些事情。

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

做这件事最好的方法是什么?

公共模块是在应用程序启动时执行的第一个代码,因为这是基础,所以它不能调用它上面的模块。

编辑:考虑到我的场景,我认为这个问题有点不完整。下面是一个解释。

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

代码语言:javascript
复制
protected static void doPeriodicUpdate() {
}

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

代码语言:javascript
复制
MySingleTonClass.doPeriodicCheck();

拥有静态方法是一种好的方法吗?

单例类可以在任何时候触发一些事件,例如

代码语言:javascript
复制
1. MyEventOne
2. MyEventTwo

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

代码语言:javascript
复制
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();
}

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

我有一种感觉,这种方法有问题。任何建议都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2014-04-12 03:46:54

看看Google's Guava library中包含的事件总线。它几乎完全是为您的用例而设计的:应用程序的一部分触发事件,而另一部分订阅这些事件,而这两部分不必相互了解(如果您通过在基本模块上注册外部模块的事件处理程序来解决此问题,通常就是这种情况)。

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

代码语言:javascript
复制
// 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注释的方法。您需要确保模块可以共享事件总线的一个实例,例如,您可以通过在基本模块中创建它,然后允许其他模块访问它来实现这一点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23021154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档