当我们有一个纯粹是语义继承而不是行为继承的对象层次结构时,不可避免地我们需要在各处编写“instanceof”或“if/else”来进行运行时类型检查。
例如
如果我有一个对象层次结构
Class Function
Class Average extends Function
Class Sum extends Function
Class Max extends Function
如果在这些类中有一个叫做calculate()的方法,那么我们就没有问题,我们可以利用多态性,这种设计满足LSP。
但是,如果我们出于某种原因不想将此 calculate() 方法添加到此层次结构中,这些对象是纯粹的普通对象,无状态对象仅代表语义。
然后我们被迫到处写下面的代码:
if (function instanceof Average)
//perform average
else if(function instanceof Sum)
//perform sum
else if(function instanceof Max)
//perform max
上面的代码表明了一个糟糕的设计,因为你到处都写了这个代码,这个设计很脆弱,以后很难改变。我想如果数字函数是有限的并且函数的计算在一个地方,这可能取决于复杂性。
到目前为止我所知道的是,要解决上述方法,唯一可能的方法是实现访问者模式,除了使用访问者模式之外,还有其他方法可以解决上述设计吗?
我从访问者模式中看到的一个问题是访问者模式的 accept 方法不返回值,如果 accept() 方法不能完全满足要求,这有时会很不方便。