首页 > 解决方案 > 具有不同参数的事件通知的最佳模式是什么?

问题描述

我正在寻找以下(方法1)的替代模式:

public interface IEventListener {
    void onFoo(String string, Integer integer, ObjectB objectB);
    void onBar(Double d, ObjectA objectA);
}

我在想这样的事情(方法2):

public interface IEventListener {
    void onEvent(Event event);
}

public enum EVENT_TYPE {
    FOO, BAR
}

public abstract class Event {
    EVENT_TYPE type;
    abstract EVENT_TYPE getType();
}

public class FooEvent extends Event {
    private String string;
    private Integer integer;
    private ObjectB objectB;

    @Override
    EVENT_TYPE getType() {
        return EVENT_TYPE.FOO;
    }
}

public class BarEvent extends Event {
    private Double d;
    private ObjectA objectA;

    @Override
    EVENT_TYPE getType() {
        return EVENT_TYPE.BAR;
    }
}

但我不确定它如何易于使用。要处理事件,我需要检查事件类型并将事件转换为正确的事件,等等。

也许没有方法1的替代品?

标签: javaoopdesign-patterns

解决方案


远离共同祖先,直到你有明确的理由来处理抽象事件(如一些日志记录、计时、排队、序列化等......)。

将侦听器编码为 lambda 也简单得多。实际上,您最好考虑一下侦听器的类,例如 Consumer<Foo> 和 Consumer<Bar>。

事件提供者将实现类似 addFooListener(Consumer<Foo> listener) {...}

处理程序可能有 public void handleFoo(Foo foo) {...}

并且设置代码将初始化 provider.addFooListener(somehandler::handleFoo);


推荐阅读