2010-04-07 91 views
0

我舉個例子,請告訴我它是不是Decorator模式?這是一個裝飾模式的例子嗎?

public abstract class ComputerComponent 
{ 
    String description ="Unknown Type"; 
    public String getDescription() 
    { 
    return description; 
    } 
    public abstract double getCost();  
} 

public abstract class AccessoryDecorator 
{ 
    ComputerComponent comp; 
    public abstract String getDescription(); 
} 

public class PIIIConcreteComp extends ComputerComponent 
{ 

    public PIIIConcreteComp() 
    { 

    description= "Pentium III"; 
    } 
    public double getCost() 
    { 

    return 19950.00;  
    } 
} 


    public class floppyConcreteDeco extends AccessoryDecorator 
    { 

    public floppyConcreteDeco(ComputerComponent comp) 
    { 
     this.comp=comp; 
    } 

    public String getDescription() 
    { 

    return comp.getDescription() +", floppy 1.44 mb"; 
    } 

    public double getCost() 
    { 

    return 250+comp.getCost(); 

    } 
} 
public class ComponentAssembly 
{ 

    public static void createComponent() 
    { 

    ComputerComponent comp = new PIIConcreteComp(); 

    // create a PIII computer object 

    ComputerComponent deco1= new floppyConcreteDeco(comp); 

    // decorate it with a floppy 

    //ComputerComponent deco2= newCDRomConcreteDeco(deco1); 

    ComputerComponent deco2= new floppyConcreteDeco(deco1); 

    // decorate with a CDRom or with one more floppy 

    System.out.println(deco2.getdescription() + " " + deco2.getCost()); 

    } 
} 

謝謝。

+2

請修復那個爛攤子。以格式化的方式閱讀代碼非常困難。 – 2010-04-07 15:13:44

+0

@Joachim Sauer:我修改了一下,現在請你告訴我嗎? – Supereme 2010-04-08 03:41:14

回答

1

你的觀點很好,但是你的代碼甚至不會編譯,主要是因爲ComputerComponent必須是必須由AccessoryDe​​corator和PIIIConcreteComp實現的接口(並且順便提一下,你的大括號非常糟糕)。通常AccessoryDe​​corator也會實現getDescription(){return comp.getDescription()}方法的「默認」實現。

+0

@ calavera.info:我已經修復了手鐲的混亂。現在你請檢查。我還有一個疑問是,'AbstratDecoraor'類是否應該擴展組件類,或者它應該包含其中一個成員作爲'組件',因爲'組件'正在裝飾中,並且如果我們想要用2或更多的裝飾者在這種情況下怎麼可能? 是否有單獨的裝飾器層次結構或它們擴展組件? – Supereme 2010-04-08 03:47:16

+0

我不確定,但在我看來,你不瞭解接口的概念。正如我在我的回答中所說的 - 計算機組件應該是一個接口(不是類),並且不擴展接口但實現它。另外,一旦這個接口被AccessoryDe​​corator實現並且你的「具體」裝飾器擴展了這個抽象類,那麼它們就隱含地實現了interace。如果你不明白這一點,你應該學習一些關於面向對象的基本知識,而不是設計模式,因爲它假設了這些基礎的完美知識。 – 2010-04-08 07:03:13

1

這確實是Decorator的設計模式,雖然有點混亂的例子。

1

這是一個裝飾圖案,但作爲財務巴雷指出,這是一個有點亂:

floppyConcreteDeco和(應以大寫字母開頭命名)/或AccessoryDecorator應該擴展ComputerComponent,但是。

原因是,你會想要使用裝飾器對象的方式與使用「普通」ComputerComponent的方式相同,除非擁有共同的基類或通用接口,否則你無法真正做到這一點。