Шаблон декоратора шаблонов проектирования

задняя часть Шаблоны проектирования

Шаблон декоратора является структурным шаблоном.

Определение шаблона декоратора

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

Состав узора-декоратора

Диаграмма классов шаблона декоратора выглядит следующим образом:

Содержит следующие роли:

  • Роль абстрактного компонента компонента: реальные объекты и декоративные объекты имеют одинаковый интерфейс. Таким образом, клиентские объекты могут взаимодействовать с декорированными объектами так же, как с реальными объектами.
  • Конкретная роль компонента 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());  
}

Суммировать

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

Шаблон декоратора позволяет динамически добавлять функции к объекту, т. е. добавлять функции к объекту извне объекта, что эквивалентно изменению внешнего вида объекта. С точки зрения системы внешнего использования используется уже не исходный объект, а объект, декорированный серией декораторов. Таким образом, функция объекта может быть гибко изменена, пока меняется динамически комбинированный декоратор, меняется функция результирующего объекта. Еще одним преимуществом является повторное использование функций декоратора: вы можете добавить один и тот же декоратор к объекту несколько раз или использовать один и тот же декоратор для украшения разных объектов. И это соответствует основному правилу объектно-ориентированного проектирования: «Максимально используйте композицию объектов, а не наследование объектов».

Преимущество:

  • Более гибкий, чем наследование. Наследование является статическим, и после наследования все подклассы имеют одинаковую функциональность. В режиме декорирования функции распределяются по каждому декоратору, а затем функции динамически комбинируются во время выполнения посредством комбинирования объектов.Конечные функции каждого декорируемого объекта определяются функциями динамического комбинирования во время выполнения.
  • Легче повторно использовать функции. Это выгодно для повторного использования функций декоратора: вы можете добавлять один и тот же декоратор к объекту несколько раз или использовать один и тот же декоратор для украшения разных объектов.
  • Упрощение высокоуровневых определений. Режим украшения может добавлять к объекту столько функций, сколько вы хотите, комбинируя декораторы. Поэтому при создании высокоуровневых определений вам нужно определить только самые основные функции. При необходимости комбинируйте соответствующие декораторы, чтобы выполнить необходимые функции. .

недостаток:

  • Многослойное декорирование сложнее

Ссылаться на

  1. Шаблон декоратора
  2. [Режим дизайна] - Режим декоратора (Decorator)