【发布时间】:2011-03-15 20:03:00
【问题描述】:
因此,在单父继承模型中,使代码可扩展以适应未来更改同时保持相同界面的最佳解决方案是什么(我想强调一个事实,即这些更改不能在最初的实施时就知道了,我的问题的主要焦点是探索支持这些变化的最佳机制/模式当它们出现时)?我知道这是一个非常基本的 OO 问题,下面我将举例说明我是如何解决这个问题的,但我想知道是否有更好的解决方案来解决这个常见问题。
这是我一直在做的事情(示例代码是在 Java 中):
一开始,创建了以下两个类和接口:
public class Foo
{
protected int z;
}
public interface FooHandler
{
void handleFoo(Foo foo);
}
public class DefaultFooHandler implements FooHandler
{
@Override
public void handleFoo(Foo foo)
{
//do something here
}
}
系统仅使用 FooHandler 类型的变量/字段,并且该对象(在本例中为 DefaultFooHandler)创建在几个明确定义的位置(可能有 FooHandlerFactory),以补偿可能发生的任何变化未来。
然后,在未来的某个时候需要扩展 Foo 以添加一些功能。因此,创建了两个新类:
public class ImprovedFoo extends Foo
{
protected double k;
}
public class ImprovedFooHandler extends DefaultFooHandler
{
@Override
public void handleFoo(Foo foo)
{
if(foo instanceof ImprovedFoo)
{
handleImprovedFoo((ImprovedFoo)foo);
return;
}
if(foo instanceof Foo)
{
super.handleFoo(foo);
return;
}
}
public void handleImprovedFoo(ImprovedFoo foo)
{
//do something involving ImprovedFoo
}
}
在上面的例子中让我畏缩的是if-statements出现在ImprovedFooHandler.handleFoo中
有没有办法避免使用if-statements 和instanceof 运算符?
【问题讨论】:
-
您在寻找访客模式吗? en.wikipedia.org/wiki/Visitor_pattern
-
@Erik,你应该把它作为答案发布)
-
@Stas:那么我必须总结一下模式 - 其他人会这样做:)
-
@Manos
ImprovedFoo扩展Foo. -
第一个问题应该是为什么你不想给 Foo 增加这个功能。您在那里的推理将确定解决问题的正确方法。
标签: java oop design-patterns inheritance extensibility