2010-04-07 2 views
0

У меня есть пример, пожалуйста, скажите мне, является ли это декоратором или нет?Является ли это образцом декоратора?

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

Пожалуйста, исправьте этот беспорядок. Очень трудно прочитать этот код так, как вы его отформатировали. –

+0

@Joachim Sauer: Я немного изменил его, теперь, пожалуйста, скажите мне? – Supereme

ответ

1

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

+0

@ calavera.info: Я исправил беспорядок брекетов. Теперь, пожалуйста, проверьте. У меня есть еще одно сомнение в вопросе, должен ли класс AbstratDecoraor расширять класс компонента или он должен содержать один из членов как «компонент», когда «компонент» оформляется, и если мы вообще хотим украсить компонент с помощью 2 или больше декораторов, как это возможно в этом случае? Есть ли отдельная иерархия декораторов или они расширяют компонент? – Supereme

+0

Я не уверен, но мне кажется, что вы не понимаете концепцию интерфейсов. Как я уже сказал в своем ответе - ComputerComponent должен быть интерфейсом (а не классом), и вы не используете интерфейс EXTEND, а ВЫПОЛНИТЕ его. Кроме того, после того, как этот интерфейс будет реализован AccessoryDecorator, а ваши «конкретные» декораторы расширят этот абстрактный класс, то они неявно задействуют это взаимодействие. Если вы этого не понимаете, вам следует изучить некоторые более общие вещи о ООП, а не шаблоны проектирования, потому что он предполагает полное знание таких основ. –

1

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

1

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

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

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

Смежные вопросы