【发布时间】:2013-05-21 08:56:53
【问题描述】:
当我们有一个纯粹继承语义而不是行为的对象层次结构时,我们不可避免地需要在各处编写“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
上面的代码表明一个糟糕的设计,因为你到处都写了这个代码,这个设计很脆弱,以后很难改变。我猜如果数量函数是有限的并且函数的计算在一个地方,这可能是可以的,这取决于复杂性。
目前我所知道的是,要解决上述方法,唯一可能的方法是实现访问者模式,除了使用访问者模式之外,还有其他方法可以解决上述设计吗?
从visitor模式中我看到一个问题是visitor模式的accept方法没有返回值,如果accept()方法不能完全满足要求,有时这很不方便。
【问题讨论】:
-
觉得策略行不通,请检查我的 cmets 下面
-
嗯好吧。但是,如果这些 if-elseif-else 块在您的项目中无处不在,则可能会将这些块重构为单独的实用程序方法
-
看来没有简单的方法来实现更好的设计? if/else 分支是不可避免的?
-
看起来像只要你坚持这个,除非你可以改变你
Function类的代码
标签: java design-patterns instanceof visitor-pattern liskov-substitution-principle