【发布时间】:2015-09-17 02:34:30
【问题描述】:
我有一个界面
public interface Details {
// nothing needed until now
}
在如下类中使用:
public class Value {
// many fields
private Details details;
public Value(SomeType type) {
switch (type) {
case TYPE_1:
case TYPE_2:
this.details = new DetailsA();
break;
case TYPE_3:
this.details = new DetailsB();
break;
default:
throw new NotImplementedException("not yet implemented");
}
}
public Details getDetails() {
return this.details;
}
}
接口有两种实现
public class DetailsA implements Details {
private BigDecimal betragA;
public DetailsA() {
}
public BigDecimal getBetragA() {
return this.betragA;
}
public void setBetragA(BigDecimal betragA) {
this.betragA = betragA;
}
}
public class DeailsB implements Details {
private BigDecimal betragB;
private boolean booleanB;
public BetragB() {
}
public BigDecimal getBetragB() {
return this.betragB;
}
public void setBetragB(BigDecimal betragB) {
this.betragB = betragB;
}
public boolean isBooleanB() {
return this.booleanB;
}
public void setBooleanB(boolean booleanB) {
this.booleanB = booleanB;
}
// some more fields
}
我有一个模型类,我想在其中使用这些细节,具体取决于实例。
public class Model extends AbstractModel {
private Details details;
public void init(StoerungValue stoerung) {
setDetails(stoerung.getSchaden().getDetails());
}
private void setDetails(Details details) {
this.details = details;
}
// ...
在那里我有一些类似以下的操作
// ...
public void setBooleanB(boolean booleanB) {
if (details instanceof DetailB) {
((DetailB) details).setBooleanB(booleanB);
}
}
// ...
我怎样才能避免这种强制转换和 instanceOf 的东西?是否有任何设计模式适用于此?
【问题讨论】:
-
您是否考虑过将 isBoolean 和 setBoolean 函数添加到接口中,并将它们添加到两个类中,而 A 类的实现什么都不做?
-
这里可能有抽象问题。如果您的操作需要知道 Details 的实现是什么,它应该直接与支持的实现一起工作。否则,每次添加新实现时,都必须更新操作代码,这与抽象模型背道而驰。或者,您的操作可以只处理所有 Details 实现共有的内容,并将实现特定的处理委托给接口中的专用方法。
-
没有方法的接口是一种设计味道。接口的全部目的是定义对象必须遵守的交互协议。如果该协议不包含任何方法,那么除了使用
Object之外,它什么也不提供。您的所有Details类要么有一个共同的交互模式,要么没有。如果他们不这样做,他们就不是真正相关的,他们的类型应该反映这一点。如果他们这样做了,那么接口应该定义这种关系。 -
我编辑了我最初的帖子,现在你可以看到我为什么使用这个界面了。 “值”类封装了详细信息。我不希望该值具有所有不同的详细信息类型(例如 getDetailsA()、getDetailsB()、...)。
-
"只有当多态行为确实是目标的行为时,多态才有意义。当它是观察者的行为时,你需要运行时类型。 sites.google.com/site/steveyegge2/when-polymorphism-fails
标签: java design-patterns casting instanceof