Паттерн Декоратор (Decorator) в Java

Паттерн Декоратор (Decorator) относится к структурным паттернам проектирования. С его помощью можно прикрепить дополнительные обязанности к объекту динамически. Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности.

Пример из реального мира. Предположим существует автомобиль. Он имеет максимальную скорость, с которой может ездить. Для того чтобы увеличить скорость не обязательно создавать другой автомобиль. Можно просто провети тюнинг (например, заменить колеса на облегченные, убрать из салона сидения пассажиров, поменять мотор как радикальная мера) - и тогда максимальная скорость автомобиля увеличится.

Простыми словами паттерн Декоратор позволяет динамически изменять поведение объекта во время выполнения, оборачивая их в объект класса декоратора.

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

Используйте Декоратор:

  • Чтобы добавлять обязанности к отдельным объектам динамически и прозрачно, то есть не затрагивая другие объекты.
  • Для обязанностей, которые могут быть сняты
  • Когда расширение с помощью подклассов нецелесообразно. Иногда возможно большое количество независимых расширений, что приведет к взрыву подклассов для поддержки каждой комбинации. Или определение класса может быть скрыто или иным образом недоступно для подклассов.

Пример паттерна декоратор на Java

Существует интерфейс Car.

public interface Car {
    public int getSpeed();
    public int getBaggageWeight();
}

У нас есть обычный автомобиль - класс SimpleCar

public class SimpleCar implements Car {
    private int speed = 50;
    private int baggageWeight = 100;

    @Override
    public int getSpeed() {
        return this.speed;
    }

    @Override
    public int getBaggageWeight() {
        return this.baggageWeight;
    }
}

Чтобы сделать из простого автомобиля скоростной спортивный автомобиль у нас есть класс-декоратор SportCar, который в конструкторе принимает класс SimpleCar и добавляет скорости обычному автомобилю.

public class SportCar implements Car {
    private Car car;
    public SportCar(Car car){
        this.car = car;
    }

    @Override
    public int getSpeed() {
        return this.car.getSpeed() + 50;
    }

    @Override
    public int getBaggageWeight() {
        return this.car.getBaggageWeight();
    }
}

Также чтобы увеличить грузоподъемность простого автомобиля у нас есть класс-декоратор Truck, который в конструкторе принимает класс SimpleCar и добавляет грузоподъемности обычному автомобилю.

public class Truck implements Car {
    private Car car;
    public Truck(Car car){
        this.car = car;
    }

    @Override
    public int getSpeed() {
        return this.car.getSpeed();
    }

    @Override
    public int getBaggageWeight() {
        return this.car.getBaggageWeight() + 1000;
    }
}

Используем обычный автомобиль SimpleCar, превращая его с помощью декораторов в спортивный автомобиль или грузовик.

public class App {
    public static void main(String[] args) {
        Car simpleCar = new SimpleCar();
        System.out.println("Speed of simple car - " + String.valueOf(simpleCar.getSpeed()));
        System.out.println("Simple car can accept baggage with weight " + String.valueOf(simpleCar.getBaggageWeight()));

        Car sportCar = new SportCar(simpleCar);

        System.out.println("Speed of sport car - " + String.valueOf(sportCar.getSpeed()));
        System.out.println("Sport car can accept baggage with weight " + String.valueOf(sportCar.getBaggageWeight()));

        Car truck = new Truck(simpleCar);

        System.out.println("Speed of truck - " + String.valueOf(truck.getSpeed()));
        System.out.println("Truck can accept baggage with weight " + String.valueOf(truck.getBaggageWeight()));
    }
}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки