当"if else"/"instance of"不可避免时,除了使用访客模式之外,我们如何改进设计呢?

gru*_*erd 5 java design-patterns liskov-substitution-principle instanceof visitor-pattern

当我们的对象层次结构纯粹是语义的继承而不是行为的继承时,那么我们不可避免地需要在任何地方编写"instanceof"或"if/else"来进行运行时类型检查.

例如

如果我有一个对象层次结构

Class Function

Class Average extends Function

Class Sum extends Function

Class Max extends Function
Run Code Online (Sandbox Code Playgroud)

如果在这些类中有一个名为calculate()的方法,那么我们没有问题,我们可以利用多态性,这种设计满足LSP.

但是,如果由于某种原因我们不想将此calculate()方法添加到此层次结构中,则这些对象纯粹是对象无状态对象,只表示语义.

然后我们被迫在任何地方编写以下代码:

if (function instanceof Average)
//perform average
else if(function instanceof Sum)
//perform sum
else if(function instanceof Max)
//perform max
Run Code Online (Sandbox Code Playgroud)

上面的代码表明设计不好,因为你在任何地方编写这个代码,这个设计很脆弱,以后很难改变.我想如果数字函数是有限的并且函数的计算在一个地方,这可能是好的取决于复杂性.

到目前为止我所知道的是,要解决上述方法,唯一可行的方法是实现访问者模式,除了使用访问者模式之外,还有其他方法可以解决上述设计吗?

我可以从访问者模式看到的一个问题是访问者模式的accept方法没有返回值,如果accept()方法不能完全满足需求,这有时候不方便.

Thi*_*ilo 1

这些对象是纯粹的普通对象,无状态对象仅代表语义。

听起来您想使用枚举而不是常规对象。

然后您可以使用switch语句并让编译器检查您是否处理了所有情况。

enum Function { Average, Sum, Max }
Run Code Online (Sandbox Code Playgroud)