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()方法不能完全满足需求,这有时候不方便.
这些对象是纯粹的普通对象,无状态对象仅代表语义。
听起来您想使用枚举而不是常规对象。
然后您可以使用switch语句并让编译器检查您是否处理了所有情况。
enum Function { Average, Sum, Max }
Run Code Online (Sandbox Code Playgroud)