Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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/4/oop/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_Oop_Events_Design Patterns - Fatal编程技术网

Java 生成事件的最佳实践?

Java 生成事件的最佳实践?,java,oop,events,design-patterns,Java,Oop,Events,Design Patterns,我想为系统设计一个事件生成/消费, 在各种情况下会发生各种类型的事件。我发现我需要在任何地方编写事件生成代码,并且事件生成代码与业务逻辑紧密耦合 例如,对于一个对象更改事件,我在所有更改该对象的方法中编写了一些代码,并且更改该对象的方法分布在项目中的许多地方 作为另一个例子,对于每个对象,都有一个已更改的事件,我必须为其编写所有对象的事件生成代码 我相信你们在解决这些问题方面有一定的经验,并且实现了一个松散耦合且易于维护的系统。你有什么建议吗 我的实现语言是Java,但我认为这个问题对于任何语言

我想为系统设计一个事件生成/消费, 在各种情况下会发生各种类型的事件。我发现我需要在任何地方编写事件生成代码,并且事件生成代码与业务逻辑紧密耦合

例如,对于一个对象更改事件,我在所有更改该对象的方法中编写了一些代码,并且更改该对象的方法分布在项目中的许多地方

作为另一个例子,对于每个对象,都有一个已更改的事件,我必须为其编写所有对象的事件生成代码

我相信你们在解决这些问题方面有一定的经验,并且实现了一个松散耦合且易于维护的系统。你有什么建议吗

我的实现语言是Java,但我认为这个问题对于任何语言都是有效的,如果还欢迎任何Java特定的解决方案:)


谢谢大家!

你可能想看看谷歌番石榴的机制。这是一种很好且简单的方法,可以将注册样板文件的事件处理程序与对象解耦


如果你想看它的语言不可知,事件总线只是描述发布订阅事件的一种模式。

你可以考虑从java语言中广泛使用的标准<代码>事件监听器< /C> >方法:

public interface ChangeListener extends java.util.EventListener {
  public void beforeChange(Object subject);
  public void afterChange(Object subject);
}

public class EventedObject {
  private List<ChangeListener> changeListeners = new ArrayList<>();

  public void addChangeListener(ChangeListener changeListener) {
    changeListeners.add(changeListener);
  }

  protected void fireBeforeChange() {
    for(ChangeListener listener : changeListeners) listener.beforeChange(this);
  }

  protected void fireAfterChange() {
    for(ChangeListener listener : changeListeners) listener.afterChange(this);
  }
}

public class MyObject extends EventedObject {
  //
  //
  public void doSomething() {
    fireBeforeChange();
    // do
    fireAfterChange();
  }
}


public class ChangeService {

  public void init() {
    MyObject myObject = new MyObject();

    myObject.addChangeListener(new ChangeListener() {
      public void beforeChange(Object subject) {
        System.out.println("Before changing " + subject);
      }

      public void afterChange(Object subject) {
        System.out.println("After changing " + subject);
      }
    });

    changeObject(myObject);
  }

  private void changeObject(MyObject object) {
    object.doSomething();
  }
}
公共接口ChangeListener扩展了java.util.EventListener{
变更前公共无效(客体主体);
变更后的公共无效(客体主体);
}
公共类事件对象{
私有列表changeListeners=new ArrayList();
公共无效addChangeListener(ChangeListener ChangeListener){
添加(changeListener);
}
受保护的无效fireBeforeChange(){
for(ChangeListener listener:changeListeners)listener.beforeChange(this);
}
受保护的无效fireAfterChange(){
for(ChangeListener listener:changeListeners)listener.afterChange(this);
}
}
公共类MyObject扩展了EventObject{
//
//
公共无效剂量测定法(){
变革前的变革();
//做
火后变化();
}
}
公共类转换服务{
公共void init(){
MyObject MyObject=新的MyObject();
myObject.addChangeListener(新的ChangeListener(){
更改前公共无效(对象-主题){
System.out.println(“更改前”+主题);
}
更改后的公共无效(对象-主体){
System.out.println(“更改后”+主题);
}
});
变更对象(myObject);
}
私有void changeObject(MyObject对象){
doSomething();
}
}
这是一个非常简单的示例,但您可以通过在侦听器参数中使用泛型类型、事件类等来扩展它