Это пример шаблона декоратора? - PullRequest
0 голосов
/ 07 апреля 2010

У меня есть пример, скажите, пожалуйста, это шаблон Декоратор или нет?

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 ]

1 голос
/ 07 апреля 2010

Это действительно шаблон проектирования Decorator, хотя и немного грязный.

1 голос
/ 08 апреля 2010

Это шаблон декоратора, но, как заметил Финбарр, он немного грязный:

floppyConcreteDeco (имя должно начинаться с заглавной буквы) и / или AccessoryDecorator, однако, должно расширяться ComputerComponent.

Причина в том, что вы захотите использовать объект декоратора так же, как вы используете "обычный" ComputerComponent, и вы не сможете сделать это, если у вас нет общего базового класса или общего интерфейса. 1009 *

1 голос
/ 07 апреля 2010

Ваша точка зрения хорошая, но ваш код даже не скомпилируется, главным образом потому, что ComputerComponent должен быть интерфейсом, который должен быть реализован AccessoryDecorator и PIIIConcreteComp (и ваши скобки, между прочим, ужасно запутаны). Обычно AccessoryDecorator также реализует реализацию «по умолчанию» своих методов, таких как getDescription () {return comp.getDescription ()}.

...