产生事件的最佳做法?

时间:2012-03-31 09:39:42

标签: java oop events design-patterns

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

例如,对于对象更改事件,我在更改该对象的所有方法中编写了一些代码,并且更改对象的方法在项目中的许多位置传播。

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:8)

您可能想看一下google guava的EventBus机制。这是一个很好的简单方法,可以将大部分事件处理程序从样板中注册到样板。

如果你想看到语言不可知,事件总线只是描述发布/订阅事件调度机制的模式。

答案 1 :(得分:3)

您可以考虑从Java类中广泛使用的标准EventListener方法开始:

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();
  }
}

这是一个非常简单的示例,但您可以通过使用泛型类型,侦听器参数中的事件类等来扩展它。