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