java - 具有不同参数的事件通知的最佳模式是什么?

标签 java oop design-patterns

我正在寻找以下模式(方法 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没有其他选择?

最佳答案

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

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

事件提供者会实现类似的东西 addFooListener(Consumer 监听器) {...}

处理程序可能有 公共(public)无效handleFoo(Foo foo){...}

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

关于java - 具有不同参数的事件通知的最佳模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64529112/

相关文章:

java - 如何将滚动 Pane 动态添加到 Swing java 中的选项卡式 Pane 中

javascript - 稍后在不使用 .prototype 的情况下将其他功能添加到类中

iphone - 如何调用 Objective-C 对象中的变量

javascript - 将窗口传入 IIFE 和其他依赖项也来自窗口

java - 在复合模式内部实现的迭代器模式

java - cxf-xjc-plugin :3. 3.0 中的 Maven MojoExecutionException

java - 重复函数的时间呈指数增加

Java - 可以删除除 '.' 和 double / float 以外的所有字符吗?

ruby - 可以将 Ruby 模块描述为单例类吗?

java - 使用 DAO 模式访问 Web session