当我们有一个纯粹是语义继承而不是行为继承的对象层次结构时,我们不可避免地需要到处编写“instanceof”或“if/else”来进行运行时类型检查。
E.g.
如果我有一个对象层次结构
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()方法不能完全满足要求,有时这并不方便。
如果您在编译时仍然知道类型,则可以使用辅助类:
class Function {
}
class Average extends Function {
}
class Sum extends Function {
}
class Max extends Function {
}
class FunctionHelper {
public Number calculate(Average a) {
return null;
}
public Number calculate(Sum s) {
return null;
}
public Number calculate(Max a) {
return null;
}
public Number calculate(Function a) {
return null;
}
}
通常,您会将辅助方法设为静态,但您并不限于此 - 您可以使用多种风格的辅助类来执行一些相当有趣的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)