生成事件的最佳实践?

4
我想为一个系统设计一个事件生成/消费机制,不同的情况下会发生各种类型的事件。但我发现我需要在每个地方都编写事件生成代码,而且事件生成代码与业务逻辑紧密耦合。
例如,对于一个对象变化的事件,我需要在所有改变该对象的方法中编写一些代码,而这些改变对象的方法分散在项目的许多地方。
另一个例子是,对于每个对象,都有一个“已更改事件”,我必须为所有对象编写事件生成代码。
我相信你们有解决这些问题并实现松散耦合和易于维护的系统的经验。你们有什么建议吗?
我的实现语言是Java,但我认为这个问题对于任何语言都是有效的,如果有任何Java特定的解决方案也欢迎 :)
谢谢!
2个回答

8
你可能想要看一下Google Guava的EventBus机制。这是一种很好且容易的方法,可以将许多事件处理程序注册样板代码从你的对象中解耦出来。
如果你想看到更加语言无关的内容,那么事件总线只是描述发布/订阅事件分发机制的模式。

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

这是一个相当简单的例子,但您可以通过使用通用类型、监听器参数中的事件类等来扩展它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接