gpt4 book ai didi

java - 如何在不使用instanceof的情况下处理多态事件

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:11 25 4
gpt4 key购买 nike

我正在设计一个 API,它接收全部继承自公共(public)基类的多种事件类型。所以可以说 EventA 和 EventB 继承自 BaseEvent这些事件需要经过几个不同的处理器。所以我认为访客模式在这里是一个不错的选择。所以 BaseEvent 看起来像这样:

public class BaseEvent implements Visitable {
void visit(Visitor visitor) {
visitor.visit(this);
}
}

现在我有一个包含 Visitable 和 Visitor 类型的 API,但它们与 API 并没有真正的关系。处理仅在接收方完成。

因此,我考虑定义不带访问者接口(interface)的 API 类型,并定义包含事件接收者的访问者的新类型但随后我必须将 API 类型转换为新类型,并且我没有找到一种方法,可以在不对每个事件类型使用 instanseof 的情况下实现这一目标

有人看到这个问题的解决方案吗?或者也许其他一些设计可以解决这个问题?

谢谢

编辑(添加更多信息):事件仅保存信息,在接收方,它们需要经过处理器。我目前有 3 种类型的事件(但可能会增加),和 2 个处理器(这也可能改变,但可能性较小)我想使用访问者模式,因为它迫使我在添加新事件时向处理器添加新方法如果我只是重写每种类型的 process() 方法,我只会在添加新事件时捕获运行时错误

最佳答案

我不确定您的用例或架构是什么样的,但我认为我在交易路由系统方面也遇到了类似的问题。定义了一些事件来路由交易、获取确认、获取执行等。事件只是哑对象,并且处理器有大量带有 instanceof 的 if 语句。

我们决定使用“真实”对象而不是事件和处理器来重新设计整个事物。这意味着“事件”不再只是信息的持有者,而是可以“自行处理”。由于它们(至少在我们的用例中)拥有所有必要的信息,因此它们实际上可以比一个或多个“外部”处理器更好地处理自己。

有多种奇怪的副作用:

  • 依赖关系变得更加清晰和容易。
  • 我们摆脱了大部分 getter/setter,因为没有必要向对象询问其所有信息。我发现这很酷。

所以基本上不是像这样的“bean”:

public class LimitOrderExecution ... {
private int executedAmount;
private int remainingAmount;
private BigDecimal executionPrice;
private Order order;
...more fields...

... setter / getter for everything ...
}

我们现在有:

public class LimitOrderExecution ... {
...fields...

public void apply() {
...applies itself using other objects...
}
}

关于java - 如何在不使用instanceof的情况下处理多态事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37208987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com