Паттерн Декоратор

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

Паттерн Декоратор

Реализация: после применения последних двух паттернов давайте продолжим работать на автоконцерн и попробуем написать программу для расчета стоимости автомобиля на основании его комплектации. Ранее при рассмотрении шаблонов проектирования, как вы могли заметить, мы старались избегать механизма наследования отдавая предпочтение композиции. Сегодня мы нарушим нашу традицию и для этого есть серьезные причины.

Начнем работу с создания двух абстрактных классов один для машин, второй для дополнительных опций к машинам:

Обратите внимание класс Decorator наследуется от класса Car! Это необходимо для согласования типов – декораторы должны относиться к тому же типу, что и декорируемые объекты.

декораторы должны относиться к тому же типу, что и декорируемые объекты

Метод getInfo() будет использоваться для перечисления дополнительных опций встраиваемых в машину, а метод getPrice() для подсчета окончательной цены автомобиля. Теперь, когда у нас есть основа нашего приложения приступим к созданию классов машин:

Оба класса машин наследуются от базового абстрактного класса Car и реализуют его метод getPrice() устанавливая индивидуальную цену на базовую модель машины. И последний штрих – классы для дополнительных опций.

Для простоты разработаем два класса – встроенный GPS навигатор и кондиционер:

В конструкторе классов мы передаем объект автомобиля, а в методах getInfo() и getPrice() добавляем описание и цену для новой комплектации.

Пришло время протестировать наш паттерн:

Вывод:

Audi A3
10000
Audi A3 + GPS
11500
Audi A3 + GPS + Air Conditioning
12500
Audi A4 + GPS + Air Conditioning
17500

Как видите все работает. В качестве закрепления материала можете в коде обработать невозможность установки сразу двух GPS приемников и добавить опцию к комплектации – «полный привод».

Классы должны быть открыты для расширения, но закрыты для изменений

Как Вы могли заметить Паттерн Декоратор достаточно прост в реализации и обладает рядом плюсов, в качестве основного плюса, я хотел бы отметить возможность динамически подключать новую функциональность объектам. Благодаря этому Java широко использует этот паттерн в классах ввода/вывода.



Паттерн Декоратор полный код примера:

Site Footer