它是装饰模式的一个例子吗?

时间:2010-04-07 15:10:26

标签: design-patterns decorator

我有一个例子,请告诉我它是否是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());  

  }  
} 

谢谢。

3 个答案:

答案 0 :(得分:1)

你的观点很好,但你的代码甚至都不会编译,主要是因为ComputerComponent必须是AccessoryDe​​corator和PIIIConcreteComp必须实现的接口(顺便说一句,你的大括号非常混乱)。通常,AccessoryDe​​corator也会实现像getDescription(){return comp.getDescription()}这样的方法的“默认”实现。

答案 1 :(得分:1)

这确实是装饰设计模式,尽管有点混乱的例子。

答案 2 :(得分:1)

这是一个装饰模式,但正如Finbarr所说,它有点混乱:

floppyConcreteDeco(应以大写字母开头命名)和/或AccessoryDecorator应扩展ComputerComponent

原因是您要使用装饰器对象的方式与使用“普通”ComputerComponent的方式相同,除非您有公共基类或公共接口,否则您无法真正做到这一点