Привет, коллеги-программисты! Сегодня мы окунёмся в чудесный мир шаблона проектирования «Декоратор». Если вы когда-нибудь хотели придать своему коду какой-нибудь удивительный декор, то эта статья для вас!
Итак, что же такое шаблон проектирования «Декоратор»? Итак, представьте, что у вас есть базовый класс или интерфейс, представляющий определенную функциональность. Вы хотите улучшить или изменить эту функциональность, не меняя исходный класс. Вот тут-то и пригодится шаблон проектирования «Декоратор»!
Шаблон «Декоратор» предполагает набор участников, которые работают вместе для достижения этой цели. Давайте познакомимся с этими участниками и узнаем, на что они способны:
- Компонент: это базовый класс или интерфейс, определяющий функциональность, которую улучшат декораторы. Это может быть абстрактный класс или интерфейс. Например, предположим, что у нас есть класс
Beverage
, который представляет базовый напиток.
public interface Beverage {
String getDescription();
double getCost();
}
- Конкретный компонент: этот класс реализует интерфейс
Component
и представляет исходный объект, который мы хотим украсить. В нашем примере классCoffee
может быть конкретным компонентом.
public class Coffee implements Beverage {
@Override
public String getDescription() {
return "Delicious Coffee";
}
@Override
public double getCost() {
return 2.0;
}
}
- Декоратор: это абстрактный класс, который также реализует интерфейс
Component
. Он содержит ссылку наComponent
и предоставляет дополнительные функции. В качестве примера давайте создадим классCondimentDecorator
.
public abstract class CondimentDecorator implements Beverage {
private Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double getCost() {
return beverage.getCost();
}
}
- Конкретный декоратор: эти классы расширяют класс
Decorator
и добавляют определенные функции или модификации к обернутому компоненту. Например, давайте создадим классMilkDecorator
, чтобы добавлять молоко в наш кофе.
public class MilkDecorator extends CondimentDecorator {
public MilkDecorator(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return super.getDescription() + ", Milk";
}
@Override
public double getCost() {
return super.getCost() + 0.5;
}
}
- Клиент: клиент несет ответственность за создание декорированных объектов. Он использует классы
Component
иDecorator
для достижения желаемой функциональности. Вот пример:
public class CoffeeShop {
public static void main(String[] args) {
Beverage coffee = new Coffee();
coffee = new MilkDecorator(coffee); // Adding milk
coffee = new SugarDecorator(coffee); // Adding sugar
System.out.println(coffee.getDescription());
System.out.println("Cost: $" + coffee.getCost());
}
}
В этом примере мы создали объект Coffee
, а затем обернули его MilkDecorator
и SugarDecorator
. Декораторы добавляют кофе дополнительную функциональность, например, молоко и сахар.
И вот оно! Используя шаблон проектирования «Декоратор», вы можете динамически улучшать и изменять поведение объектов, не меняя их исходную структуру. Он обеспечивает возможность повторного использования кода и гибкость, позволяя смешивать и сопоставлять функциональные возможности по мере необходимости.
Итак, давайте раскроем возможности шаблона проектирования «Декоратор» в своем коде. Ваше будущее будет вам за это благодарно!