Задать вопрос
@Romzasin
Студент, программист-новичок

Что за шаблон Декоратор, и зачем он нужен?

Не могу понять суть шаблона Декоратор и в связи с этим не могу понять, как дописать код:

//TODO1: Add abstract class Component
abstract class Component {
    
}

class SalesTicket extends Component {
    public void prtTicket() {
          System.out.println("My ticket");
    }
}
//TODO2: Add abstract class TicketDecorator
//It has Component member, constructor and callTrailer method
abstract class TicketDecorator {
    Component myComponent;
    public TicketDecorator(Component myComponent){
        
    }
    public void callTrailer() {
        
    };    
}
 
 
class Header1 extends TicketDecorator {
    public Header1 (Component myComponent) {
        super(myComponent);
    }
    public void prtTicket () {
        System.out.println("*** Header1 ***");
        super.callTrailer();
    }
}
class Header2 extends TicketDecorator {
    public Header2 (Component myComponent) {
        super(myComponent);
    }
    public void prtTicket () {
        System.out.println("*** Header2 ***");
        super.callTrailer();
    }
}
class Footer1 extends TicketDecorator {
    public Footer1 (Component myComponent) {
        super(myComponent);
    }
    public void prtTicket() {
        super.callTrailer();
        System.out.println("*** Footer1 ***");
    }
}
class Footer2 extends TicketDecorator {
    public Footer2 (Component myComponent) {
        super(myComponent);
    }
    public void prtTicket() {
        super.callTrailer();
        System.out.println("*** Footer2 ***");
   }
}
class Client {
    public static void main(String[] args) {
       //TODO3: Create a decorated sales ticket and print it       
   }
}
  • Вопрос задан
  • 444 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
То что вы реализовали - не декоратор. Декоратор это интерфейсы а не абстрактные классы.

суть шаблона Декоратор


Декоратор, это такой шаблон, при котором мы "расширяем" поведение объекта без изменения оного. При этом важная состовляющая - интерфейс объекта не меняется.

У декорации есть значительное преимущество перед наследованием, а именно возможность делать бесконечные цепочки декораторов с возможностью произвольно менять их местами без внесения изменений непосредственно в код.

К примеру при использовании контейнера зависимостей, мы можем обернуть какой-то сервис в декоратор временно, и в декораторе логировать аргументы и результат выполнения методов. Скажем это нужно только для быстрого дебага. Делаем быстренько декоратор, подсовываем его вместо настоящей реализации (обычно это одна строчка в di-конфиге) и вуаля. Мы не вносили изменений в код а стало быть не могли ничего сломать случайно. История изменений будет выглядеть красиво. Да и тестировать такие вещи намного проще.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы