2010-04-07 82 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的方式相同,除非拥有共同的基类或通用接口,否则你无法真正做到这一点。