Шаблон декоратора является структурным шаблоном.
Определение шаблона декоратора
Шаблон декорирования может динамически добавлять некоторые дополнительные функции (улучшения) к объекту.По сравнению с наследованием шаблон декорирования может улучшать классы, не поддерживающие наследование, и он более гибкий, чем наследование, и не требует генерации большого количества подклассы.
Состав узора-декоратора
Диаграмма классов шаблона декоратора выглядит следующим образом:
Содержит следующие роли:
- Роль абстрактного компонента компонента: реальные объекты и декоративные объекты имеют одинаковый интерфейс. Таким образом, клиентские объекты могут взаимодействовать с декорированными объектами так же, как с реальными объектами.
- Конкретная роль компонента ConcreteComponent: определите конкретный объект, и вы также можете добавить некоторые обязанности к этому объекту.
- Роль декоратора декоратора: содержит ссылку на абстрактный компонент. Декорированный объект принимает все клиентские запросы и перенаправляет эти запросы реальному объекту. Таким образом, новые функции могут быть добавлены до и после вызова реального объекта.
- Конкретная декоративная роль ConcreteDecorator: отвечает за добавление новых обязанностей к объекту-компоненту. Цель соответствует интерфейсу. Адаптируйте интерфейс Adaptee к интерфейсу Target.
Реализация шаблона декоратора
абстрактный компонент
public abstract class House {
String description = "";
public String getDescription() {
return description;
}
public abstract void sleep();
}
бетонные компоненты
public class MyHouse extends House {
public MyHouse() {
description = "自己的房子";
}
@Override
public void sleep() {
return "在自己房子睡觉";
}
}
абстрактный декоратор
public abstract class BigHouseDecorator extends House {
@Override
public abstract String getDescription();
}
декоратор бетона
public class European extends BigHouseDecorator {
House house ;
public European(House house) {
this.house = house;
}
@Override
public String getDescription() {
return house.getDescription()+"欧式装修";
}
@Override
public void sleep() {
return "欧式装修,睡着更舒服";
}
}
тестовый класс
@Test
public void testDecorator() {
House house = new MyHouse();
System.out.println(house.getDescription() + " : " + house.sleep());
house = new European(coffee);
System.out.println(coffee.getDescription()+" : " + house.sleep());
}
Суммировать
Эта статья в основном знакомит с концепцией и реализацией шаблона декоратора. В нормальных условиях для расширения класса часто используется наследование, поскольку наследование вводит в класс статические функции, а с увеличением расширенных функций подклассы будут сильно раздуты. Чтобы расширить класс без добавления большого количества подклассов, вы можете использовать шаблон декоратора.
Шаблон декоратора позволяет динамически добавлять функции к объекту, т. е. добавлять функции к объекту извне объекта, что эквивалентно изменению внешнего вида объекта. С точки зрения системы внешнего использования используется уже не исходный объект, а объект, декорированный серией декораторов. Таким образом, функция объекта может быть гибко изменена, пока меняется динамически комбинированный декоратор, меняется функция результирующего объекта. Еще одним преимуществом является повторное использование функций декоратора: вы можете добавить один и тот же декоратор к объекту несколько раз или использовать один и тот же декоратор для украшения разных объектов. И это соответствует основному правилу объектно-ориентированного проектирования: «Максимально используйте композицию объектов, а не наследование объектов».
Преимущество:
- Более гибкий, чем наследование. Наследование является статическим, и после наследования все подклассы имеют одинаковую функциональность. В режиме декорирования функции распределяются по каждому декоратору, а затем функции динамически комбинируются во время выполнения посредством комбинирования объектов.Конечные функции каждого декорируемого объекта определяются функциями динамического комбинирования во время выполнения.
- Легче повторно использовать функции. Это выгодно для повторного использования функций декоратора: вы можете добавлять один и тот же декоратор к объекту несколько раз или использовать один и тот же декоратор для украшения разных объектов.
- Упрощение высокоуровневых определений. Режим украшения может добавлять к объекту столько функций, сколько вы хотите, комбинируя декораторы. Поэтому при создании высокоуровневых определений вам нужно определить только самые основные функции. При необходимости комбинируйте соответствующие декораторы, чтобы выполнить необходимые функции. .
недостаток:
- Многослойное декорирование сложнее