Design patterns 这是装饰图案的一个例子吗?

Design patterns 这是装饰图案的一个例子吗?,design-patterns,decorator,Design Patterns,Decorator,我有一个例子,请告诉我它是否是装饰图案 public abstract class ComputerComponent { String description ="Unknown Type"; public String getDescription() { return description; } public abstract double getCost(); } public abstract class Ac

我有一个例子,请告诉我它是否是装饰图案

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());  

  }  
} 

多谢各位

你的观点很好,但你的代码甚至无法编译,主要是因为ComputerComponent必须是接口,必须由AccessoryDecorator和PIIIConcreteComp实现(顺便说一句,你的大括号太乱了)。通常AccessoryDecorator还将实现其方法的“默认”实现,如getDescription(){return comp.getDescription()}。

您的观点是正确的,但您的代码甚至不会编译,主要是因为ComputerComponent必须是接口,必须由AccessoryDecorator和PIIIConcreteComp实现(顺便说一句,你的大括号太乱了)。通常AccessoryDecorator也会实现其方法的“默认”实现,比如getDescription(){return comp.getDescription()}.

这确实是装饰设计模式,尽管有点凌乱。

这确实是装饰设计模式,尽管有点凌乱。

这是装饰设计模式,但正如芬巴尔指出的,它有点凌乱:

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


原因是您希望以与使用“普通”计算机组件相同的方式使用decorator对象,除非您有一个公共基类或一个公共接口,否则您无法真正做到这一点。

这是一个decorator模式,但正如Finbarr指出的,它有点混乱:

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


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

请修复这个混乱。按照你格式化的方式读取代码是非常困难的。@Joachim Sauer:我现在对它做了一点修改,你能告诉我吗?请修复这个混乱。按照你格式化的方式读取代码是非常困难的我已经修改过了。@Joachim Sauer:我已经修改了一点,你能告诉我吗?@calavera.info:我已经修复了括号的混乱。现在请你检查一下。我还有一个疑问,那就是“Abstratdecaraor”类是否应该扩展组件类,或者在“组件”被修饰时,它应该包含一个成员作为“组件”,如果我们需要的话ant用两个或更多的装饰器装饰一个组件在这种情况下怎么可能?装饰器是否有独立的层次结构或它们扩展了组件?我不确定,但在我看来,您似乎不理解接口的概念。正如我在回答中所说的-ComputerComponent应该是一个接口(而不是类)而且,当这个接口被AccessoryDecorator和您的“具体”实现后装饰器扩展了抽象类,然后隐式地实现了这个交互。如果你不理解这一点,你应该学习一些关于OOP的基本知识,而不是设计模式,因为它假设你对这些基本知识有完美的了解。@calavera.info:我已经修复了括号的混乱。现在请检查一下。我还有一个疑问要问询问“Abstratdecaraor”类是否应该扩展组件类,或者在“组件”被修饰时,它应该包含一个成员作为“组件”,如果我们想用2个或更多的装饰器装饰一个组件,在这种情况下怎么可能呢?是否有单独的装饰器层次结构,或者它们扩展了组件?我不确定,但在我看来,你似乎不理解接口的概念。正如我在回答中所说的——ComputerComponent应该是一个接口(而不是类),你不扩展接口而是实现它。而且,一旦这个接口被AccessoryDecorator和你的“具体”实现了装饰器扩展了这个抽象类,然后它们也隐式地实现了这个交互。如果你不理解这一点,你应该学习一些关于OOP的基本知识,而不是设计模式,因为它假设你对这些基本知识有完美的了解。