Назад к вопросам
Junior
70
questionbank

Для чего используется декоратор в программировании?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Декоратор используется для динамического добавления обязанностей объекту. Он обёртывает исходный объект и делегирует вызовы методов, при этом добавляя или изменяя поведение до или после вызова основного метода. Это позволяет расширять функциональность без изменения исходного класса. Главное преимущество — гибкое комбинирование различных декораторов.

// Интерфейс, определяющий базовую функциональность
interface Component {
    String operation();
}

// Конкретный класс, реализующий интерфейс
class ConcreteComponent implements Component {
    @Override
    public String operation() {
        return "Базовая функция";
    }
}

// Абстрактный класс декоратора
abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public String operation() {
        return component.operation();
    }
}

// Конкретный декоратор, добавляющий новое поведение
class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public String operation() {
        return "Декоратор А(" + super.operation() + ")";
    }
}

// Другой конкретный декоратор
class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public String operation() {
        return "Декоратор Б(" + super.operation() + ")";
    }
}

/*
// Пример использования:
public class Main {
    public static void main(String[] args) {
        Component simple = new ConcreteComponent();
        System.out.println("Простой объект: " + simple.operation());

        Component decoratorA = new ConcreteDecoratorA(simple);
        System.out.println("Объект с декоратором А: " + decoratorA.operation());

        Component decoratorB = new ConcreteDecoratorB(decoratorA);
        System.out.println("Объект с декораторами А и Б: " + decoratorB.operation());
    }
}
*/

Сравнение с наследованием:

Аспект Декоратор Наследование
Расширение Динамическое добавление поведения во время выполнения Статическое расширение во время компиляции
Гибкость Легко комбинировать несколько декораторов Создает жесткую иерархию классов
Множество функций Каждый декоратор добавляет одну функцию Множественное увеличение классов при добавлении функций
Изменение поведения Обёртывает объект, не меняя его класс Требует модификации базового или производного класса