我想设计一个为系统生成/消费的事件, 在各种情况下会有各种类型的事件发生。我发现我需要在任何地方编写事件生成代码,事件生成代码与业务逻辑紧密结合。
例如,对于对象更改事件,我在更改该对象的所有方法中编写了一些代码,并且更改对象的方法在项目中的许多位置传播。
作为另一个例子,对于每个对象,都有一个已更改的事件,我必须为所有对象编写事件生成代码。
我相信你们在解决问题方面有一些经验,并且实现了一个松散耦合且易于维护的系统。你有什么建议吗?
我的实现语言是Java,但我认为这个问题对任何语言都有效,如果也欢迎任何Java特定的解决方案:)
谢谢!
答案 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();
}
}
这是一个非常简单的示例,但您可以通过使用泛型类型,侦听器参数中的事件类等来扩展它。