2015-03-03 3 views
2

Я пытаюсь изучить узор декоратора, и у меня есть проблема с ним.Проблема с рисунком декоратора

Во-первых, у меня есть интерфейс

public interface MyCar { 
    public String getMessage(int speed); 
    public int getPrice(); 
} 

Я реализовал этот класс, как это;

public class Car implements MyCar{ 
    protected int price; 
    protected boolean feature1; 
    protected boolean feature2; 

    public Car(){ 
     this.price = 0; 
     this.feature1 = false; 
     this.feature2 = false; 
    } 
    publicCar(int price){ 
     this.price = price; 
     this.feature1 = false; 
     this.feature2 = false; 
    } 

    int getPrice(){ 
     return price + (feature1 ? 1000 : 0) + (feature2 ? 2000 : 0); 
    } 
} 

После этого я получены две машины из этого класса, как

public class Car1 extends Car{ 
    private static int price = 20000; 

    public Car1() { 
     super(price); 
    } 
} 

car2 класс точно так же, за исключением того, от цены, которая является 30000.

После этого момента я создал класс автомобиля декоратора который;

public abstract class CarDecorator extends Car { 
    protected Car decoratedCar; 

    public CarDecorator(){ 
     decoratedCar = new Car(); 
    } 

    public CarDecorator(Car decoratedCar) { 
     this.decoratedCar = decoratedCar; 
    } 

    public int getPrice(){ 
     return this.decoratedCar.getPrice(); 
    } 
} 

Наконец я создал класс 2 decorater, полученный из CarDecorator:

public class F1Decorator extends CarDecorator{ 

    public F1Decorator(Car car) { 
     super(car); 
     decoratedCar.feature1 = true; 
    } 
} 

public class F2Decorator extends CarDecorator{ 

    public F2Decorator(Car car) { 
     super(car); 
     decoratedCar.feature2 = true; 
    } 
} 

public class Test { 

    public static void main(String[] args){ 

     Car car1 = new Car1(); 
     System.out.println("Price: " + car1.getPrice()); 

     car1 = new F1Decorator(car1); 
     System.out.println("Price: " + car1.getPrice()); 

     car1 = new F2Decorator(car1); 
     System.out.println("Price: " + car1.getPrice()); 
    } 
} 

И выход

Price: 20000 
Price: 21000 
Price: 21000 

Почему feature2 не оказывает никакого влияния на car1. Что не так с моим дизайном. Если вы можете помочь, я догадываюсь, что очень хорошо пойму шаблон декоратора.

+1

Я не вижу 'feature2' используется в' метод getPrice'. Возможно, его следует использовать там. – rgettman

+0

извините за опечатку. Я изменил его. Просто скопируйте ошибку пасты. Проблема все еще возникает. – xxlali

ответ

3

Когда вы украшаете car1 с F1Decorator, вы возвращаете F1Decoorator, который является Car. Конструктор устанавливает feature1 на оригинале car1. Этот новый декорированный автомобиль назначен на car1.

Однако, когда вы украшаете car1 снова F2Decorator, вы декорирования F1Decorator, а не оригинальный Car. Исключить: F1Decoratorfeature2, не оригинал Carfeature2. Из-за этого feature2 на оригинале Car по-прежнему false, а цена остается 21000.

Внесите и вызовите методы на Car и классы декоратора, которые пройдут через настройки функций до Car.

В Car:

public void setFeature1(boolean feat1) 
{ 
    this.feature1 = feat1; 
} 

public void setFeature2(boolean feat2) 
{ 
    this.feature2 = feat2; 
} 

В CarDecorator:

public void setFeature1(boolean feat1) 
{ 
    this.decoratedCar.setFeature1(feat1); 
} 

public void setFeature2(boolean feat2) 
{ 
    this.decoratedCar.setFeature2(feat2); 
} 

В F1Decorator:

public F1Decorator(Car car) { 
    super(car); 
    // Replace the assignment with this line. 
    decoratedCar.setFeature1(true); 
} 

И в F2Decorator:

public F2Decorator(Car car) { 
    super(car); 
    decoratedCar.setFeature2(true); 
} 

С учетом этих изменений, выход теперь:

Price: 20000 
Price: 21000 
Price: 23000 
+0

большое спасибо – xxlali

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