Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
事件通知:Java设计模式_Java_Design Patterns - Fatal编程技术网

事件通知:Java设计模式

事件通知:Java设计模式,java,design-patterns,Java,Design Patterns,我正在做一个有几个模块的项目。我有一个位于底部的模块,它是所有模块的公用模块。 我在基本模块中有一个业务对象(这是singleton类),它可以触发一个事件,表明某些事情已经完成 我希望每个模块都能听到这个事件,并做一些具体的事情 最好的方法是什么 公共模块是在应用程序启动时执行的第一个代码,因为这是基础,所以它不能调用上面的模块 编辑: 考虑到我的情况,我认为这个问题有点不完整。下面是一个解释 我有一个单例类(我将其设置为不可变)。此类存在于基本模块中。它有一个静态方法getInstance(

我正在做一个有几个模块的项目。我有一个位于底部的模块,它是所有模块的公用模块。 我在基本模块中有一个业务对象(这是singleton类),它可以触发一个事件,表明某些事情已经完成

我希望每个模块都能听到这个事件,并做一些具体的事情

最好的方法是什么

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

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

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

protected static void doPeriodicUpdate() {
}
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();
}
并从后台调度程序调用此方法,如

MySingleTonClass.doPeriodicCheck();
使用静态方法是一种好方法吗

singleton类可以在任何时候触发某些事件,如

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

protected static void doPeriodicUpdate() {
}
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服务


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

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

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

// 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
注释方法。您只需确保模块可以共享事件总线的一个实例,例如,您可以在基本模块中创建它,然后允许其他模块访问它。

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

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

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