我正在设计一个接收多个事件类型的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()方法,我只会在添加新事件时在运行时捕获错误
答案 0 :(得分:0)
有几种选择:
instanceof
可能 不好。既不是performance,也不是编码式POV。那么为什么即使使用一些解决方法,如果你不需要?
只需覆盖需要单独处理的每个事件的方法:
class EventReceiver{
void eventReceived(BaseEvent e){
}
void eventReceived(EventA e){
}
...
}
当然可以为您的访客模式做同样的事情。虽然这里的访客模式相当多余。
如果您不想按类型区分事件,只需添加一个允许在没有instanceof
的情况下识别事件的变量。虽然这只是instanceof
运算符的解决方法。
答案 1 :(得分:0)
我不确定您的用例或体系结构是什么样的,但我认为我有类似的问题,使用交易路由系统。有一些事件被定义用于路由交易,获得确认,获得执行等。事件只是愚蠢的对象,而且处理器中有很多带有instanceof
s的if语句。
我们决定使用“真实”对象而不是事件和处理器来重新设计整个事物。这意味着“事件”不再仅仅是信息的持有者,而是他们可以“自我处理”。由于它们(至少在我们的用例中)具有所有所需的信息,因此它们实际上可以比一个或多个“外部”处理器更好地处理它们。
有多种奇怪的副作用:
所以基本上不是像这样的“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...
}
}