Структурные шаблоны проектирования: шаблон декоратора

Декоратор относится к шаблонам проектирования Структура, что очень полезно.

Структурные шаблоны проектирования объясняют, как собирать объекты и классы в более крупные структуры, сохраняя при этом структуры гибкими и эффективными. Итак, декоратор — один из способов сделать это.

Паттерн Decorator позволяет нам добавлять новую функциональность к существующим объектам, вообще не меняя их структуру. Проще говоря, он позволяет изменять объекты во время выполнения.

Давайте обсудим на примере.

Мы собираемся собрать автомобиль с некоторыми функциями, такими как режим роскоши, режим спорта и краски. Таким образом, мы можем создать настоящую машину и даже игрушечную машину в основном в этой настройке. Нам просто нужно добавить функции. Если мы спроектируем это, используя простую диаграмму UML, это будет именно так.

Intellij Ultimate IDE будет представлять такие классы…

Давайте посмотрим на код!!

Автомобильный интерфейс:

public interface Car {
    void assemble();
}

Два типа автомобилей (бетонные компоненты):

public class RealCar implements Car {
    @Override
    public void assemble() {
        System.out.print("Real Car");
    }
}
public class ToyCar implements Car {
    @Override
    public void assemble() {
        System.out.print("Toy Car");
    }
}

Теперь мы собираемся создать абстрактный декоратор.

public abstract class CarDecorator implements Car {
    private final Car car;
    public CarDecorator(Car c) {
        this.car = c;
    }
    @Override
    public void assemble() {
        this.car.assemble();
    }
}

Это декоративная основа. Теперь нам нужны функциональные возможности для украшения автомобиля! Давайте также создадим эти декораторы бетона

Роскошный декоратор

public class LuxuryDecorator extends CarDecorator {
    public LuxuryDecorator(Car c) {
        super(c);
    }
    @Override
    public void assemble() {
        super.assemble();
        System.out.print(" with Luxury interior");
    }
}

Декоратор спорта

public class SportsDecorator extends CarDecorator {
    public SportsDecorator(Car c) {
        super(c);
    }
    @Override
    public void assemble(){
        super.assemble();
        System.out.print(" with Sports mode");
    }
}

Декоратор краски

public class PaintDecorator extends CarDecorator{
    public PaintDecorator(Car c) {
        super(c);
    }
    @Override
    public void assemble(){
        super.assemble();
        System.out.print(" with Painted skin");
    }
}

Хорошо! Теперь мы можем идти. Итак, давайте посмотрим, как мы можем создавать разные типы автомобилей без изменения их существующей структуры.

Клиентский код будет таким.

// basic real car
Car realCar = new RealCar();
realCar.assemble();
System.out.println("\n*****");
// real sports car
Car sportsCar = new SportsDecorator(new RealCar());
sportsCar.assemble();
System.out.println("\n*****");
// real sports car with luxury interior
Car sportsLuxuryCar = new SportsDecorator(new LuxuryDecorator(new RealCar()));
sportsLuxuryCar.assemble();
System.out.println("\n*****");
// real painted car with luxury interior and sports mode
Car sportsLuxuryPaintedCar = new SportsDecorator(new LuxuryDecorator(new PaintDecorator(new RealCar())));
sportsLuxuryPaintedCar.assemble();
System.out.println("\n*****");
// real painted luxury car
Car luxuryPaintedCar = new LuxuryDecorator(new PaintDecorator(new RealCar()));
luxuryPaintedCar.assemble();
System.out.println("\n*****");
// painted toy car
Car paintedToyCar = new PaintDecorator(new ToyCar());
paintedToyCar.assemble();
System.out.println("\n*****");

Результат будет таким…

Посмотрите, как мы можем создавать автомобили, ребята! Мы можем настроить автомобиль так, как мы хотим… Это очень удобно для повторного использования и сопровождения с точки зрения логики кода.

Такой же пример из жизни приходит мне на ум… Вот так мы заказываем пиццу! Подумай об этом! Мы можем заказать двойную куриную пиццу / пиццу тандури / пиццу на тонком тесте и т. Д. В то же время мы просим парней из пиццы добавить больше сыров, выпечки или любых других начинок, что является дополнительной услугой, предоставляемой ими. . Итак, мы можем создать нашу собственную фабрику пиццы, также следуя этому шаблону проектирования…

Это просто шаблон декоратора! Надеюсь, вы уловили идею, которую я здесь объяснил. Попробуйте использовать этот шаблон при разработке кода. Как известно, дизайн всегда имеет значение!