Автор оригинала: Pankaj Kumar.
Шаблон дизайна декоратора используется для изменения функциональности объекта во время выполнения. В то же время это не повлияет на другие экземпляры того же класса, поэтому отдельный объект получает измененное поведение. Шаблон дизайна декоратора является одним из шаблонов структурного дизайна (например, Шаблон адаптера , Шаблон моста , Составной шаблон ) и использует абстрактные классы или интерфейс с композицией для реализации.
Шаблон Дизайна Декоратора
Мы используем наследование или композицию для расширения поведения объекта, но это делается во время компиляции и применимо ко всем экземплярам класса. Мы не можем добавить какую – либо новую функциональность для удаления любого существующего поведения во время выполнения-это когда появляется шаблон декоратора.
Предположим, мы хотим реализовать различные типы автомобилей – мы можем создать интерфейсный автомобиль для определения метода сборки, а затем у нас может быть базовый автомобиль, далее мы можем расширить его до спортивного автомобиля и автомобиля класса люкс. Иерархия реализации будет выглядеть так, как показано на рисунке ниже.
Но если мы хотим получить автомобиль во время выполнения, который обладает как функциями спортивного автомобиля, так и роскошного автомобиля, то реализация усложняется, и если мы хотим уточнить, какие функции следует добавить в первую очередь, это становится еще более сложным. Теперь представьте, что если у нас будет десять различных типов автомобилей, логикой реализации, использующей наследование и композицию, будет невозможно управлять. Чтобы решить такую ситуацию программирования, мы применяем шаблон декоратора в java.
Нам нужны следующие типы для реализации шаблона дизайна декоратора.
Интерфейс компонента – Интерфейс или абстрактный класс , определяющий методы, которые будут реализованы. В нашем случае
Автомобильбудет интерфейсом компонента.Реализация компонента – Базовая реализация интерфейса компонента. Мы можем иметь
Базовый автомобилькласс в качестве нашей компонентной реализации.Декоратор – Класс декоратора реализует интерфейс компонента и имеет связь с интерфейсом компонента. Переменная компонента должна быть доступна дочерним классам декоратора, поэтому мы сделаем эту переменную защищенной.
Конкретные декораторы – Расширение функциональности базового декоратора и соответствующее изменение поведения компонентов. У нас могут быть классы декораторов бетона, такие как
Роскошный автомобильиСпортивный автомобиль.
Шаблон Дизайна Декоратора – Диаграмма Классов
Программа Тестирования Шаблонов Дизайна Декоратора
package com.journaldev.design.test;
import com.journaldev.design.decorator.BasicCar;
import com.journaldev.design.decorator.Car;
import com.journaldev.design.decorator.LuxuryCar;
import com.journaldev.design.decorator.SportsCar;
public class DecoratorPatternTest {
public static void main(String[] args) {
Car sportsCar = new SportsCar(new BasicCar());
sportsCar.assemble();
System.out.println("\n*****");
Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
sportsLuxuryCar.assemble();
}
}
Обратите внимание, что клиентская программа может создавать различные типы объектов во время выполнения, и они также могут указывать порядок выполнения.
Результатом вышеуказанной тестовой программы является:
Basic Car. Adding features of Sports Car. ***** Basic Car. Adding features of Luxury Car. Adding features of Sports Car.
Шаблон Дизайна Декоратора – Важные Моменты
- Шаблон дизайна декоратора полезен для обеспечения возможностей модификации во время выполнения и, следовательно, более гибок. Его легко поддерживать и расширять, когда количество вариантов больше.
- Недостатком шаблона дизайна декоратора является то, что в нем используется много подобных объектов (декораторов).
- Шаблон декоратора часто используется в классах Java IO , таких как FileReader, BufferedReader и т.д.