2011-10-27 244 views
0

好,我要直接, 它是關於裝飾圖案 你會看到,我做了這個圖來舉例說明情況裝飾具有相同的名稱

我有兩個類(可以說: CAR和VAN),這是相關的圖形說,我需要

自由組合兩個裝飾類。 但我有一個裝飾只適用於其中之一 因爲這些裝飾添加特定的功能,但這功能本質上是

相同的通訊員類別。

我可以將它們命名爲相同嗎?

以下相同的圖 我試圖從CAR繼承VAN。這樣它們都具有相同的裝飾..但作爲IA說

VAN不能有液化氣」

所以我的問題是.. 我可以說出他們都裝飾機一樣嗎?

感謝很多提前

gmocamilo

http://www.depositodeimagenes.com/images/h2bpM.jpg

PD。我很抱歉,但日e系統不允許我上傳數字

+0

THW最佳來源來自http://sourcemaking.com/design_patterns/decorator但不存在或其他地方,我發現這種情況 – camilo

回答

0

我想你應該創建一個類Car,然後你創建一個CarDecorator類。您可以從CarDecorator繼承包含所需屬性的類。

這樣,當您創建使用類從CarDecorator各種「零件」添加到你的車,因爲你是從CarDecorator繼承您可以有一個構造函數一個CarDecorator作爲參數級聯屬性車:

例如

Car* van = new Car(new FourWheelDrive()); 

Car* car = new Car(new FourWheelDrive(new LiquidGas())); 

當然,你可以把FourWheelDrive從一開始的基類車,但這樣做如果你想在未來的三輪汽車,你將不得不用所有的意思改變基類。上述方法允許你保持基類不變。

+0

安德斯.. 我覺得這有點複雜,這是我的錯,因爲我應該提到我不能改變基類 ,但我要把它賬戶 非常感謝你的貢獻! – camilo

1

有兩個類做同樣的事情,並具有相同的名稱通常是一個不好的做法,像所有的代碼重複。 FourWheelDrive裝飾者應該從車輛直接下降並接受車輛作爲裝飾。該LiquidGas裝飾可以從SimpleCar下降並接受SimpleCar作爲decoratee,如果你想它的使用限制,以SimpleCar:

這個模式
class LiquidGasDecorator extends Vehicle 
{ 
    private SimpleCar simplecar_; 
    public LiquidGasDecorator(SimpleCar simplecar) 
    { 
    simplecar_ = simplecar; 
    } 
} 

Vehicle fourwheelvan = new FourWheelDriveDecorator(new Van()); 
Vehicle fourwheelcarwithlpg = new LiquidGasDecorator(new FourWheelDriveDecorator(new SimpleCar))); 
+0

Ozan 你是完全正確的! 我迷失在兒童班的細節 我不知道我錯過了這個明顯的安排 非常感謝你! – camilo