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

时间:2016-05-13 11:31:59

标签: java oop polymorphism

我正在设计一个接收多个事件类型的API,这些事件类型都继承自公共基类。所以我们假设EventA和EventB继承自BaseEvent 这些事件需要通过几个不同的处理器。 所以我虽然访客模式在这里是个不错的选择。 所以BaseEvent看起来像这样:

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

所以现在我有一个包含Visitable和Visitor类型的API,但它们与API并不真正相关。 处理只在接收方进行。

所以我想在没有Visitor接口的情况下定义API类型,并定义包含事件接收者访问者的新类型 但是我必须将API类型转换为新类型,并且我没有看到一种方法来实现它而不使用instanseof来处理每种事件类型

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

由于

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

2 个答案:

答案 0 :(得分:0)

有几种选择:

的instanceof

instanceof可能 不好。既不是performance,也不是编码式POV。那么为什么即使使用一些解决方法,如果你不需要?

方法覆盖

只需覆盖需要单独处理的每个事件的方法:

class EventReceiver{
    void eventReceived(BaseEvent e){
    }

    void eventReceived(EventA e){
    }

    ...
}

当然可以为您的访客模式做同样的事情。虽然这里的访客模式相当多余。

另一个事件结构

如果您不想按类型区分事件,只需添加一个允许在没有instanceof的情况下识别事件的变量。虽然这只是instanceof运算符的解决方法。

答案 1 :(得分:0)

我不确定您的用例或体系结构是什么样的,但我认为我有类似的问题,使用交易路由系统。有一些事件被定义用于路由交易,获得确认,获得执行等。事件只是愚蠢的对象,而且处理器中有很多带有instanceof s的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...
    }
}