我這是在課堂上使用類似下面的界面避免鑄造}這種
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);
}
}
// ...
一些操作我怎樣才能避免這種鑄造}這種東西?這裏有適用的設計模式嗎?
您是否考慮過將isBoolean和setBoolean函數添加到接口中並將它們添加到這兩個類,其中類A的實現什麼都不做? – xception
這裏你可能有一個抽象問題。 如果您的操作需要知道細節的實現是什麼,它應該直接與受支持的實現協同工作。否則,每次添加新的實現時,都必須更新操作代碼,這與抽象模型相違背。 或者,您的操作只能處理所有細節實現的常見操作,並將特定於實現的處理委託給接口中的專用方法。 –
沒有方法的接口是一種設計氣味。接口的全部目的是定義一個對象必須遵守的交互協議。如果該協議不包含任何方法,那麼它只提供「Object」。你所有的'Details'類都有一個通用的交互模式,或者它們不是。如果他們不相關,他們的類型應該反映這一點。如果他們這樣做,那麼接口應該定義這種關係。 –