Различие между составным шаблоном и шаблоном "декоратор"?

Каково различие между Составным Шаблоном и Шаблоном "декоратор"?

47
задан Aditya W 23 September 2016 в 14:14
поделиться

2 ответа

Обычно они идут рука об руку. Использование композитного паттерна часто приводит к использованию паттерна декоратора.

Композитный паттерн позволяет вам построить иерархическую структуру (например, дерево элементов) таким образом, что внешний код будет рассматривать всю структуру как единое целое. Таким образом, интерфейс для листовой сущности точно такой же, как и для составной сущности. Суть в том, что все элементы в вашей составной структуре имеют одинаковый интерфейс, даже если некоторые из них являются листовыми узлами, а другие - целыми структурами. Пользовательские интерфейсы часто используют этот подход, чтобы обеспечить легкую композитивность.

http://en.wikipedia.org/wiki/Composite_pattern

Паттерн декоратора позволяет сущности полностью содержать другую сущность так, что использование декоратора выглядит идентично содержащейся сущности. Это позволяет декоратору изменять поведение и/или содержание того, что он инкапсулирует, не меняя внешнего вида сущности. Например, вы можете использовать декоратор для добавления вывода логов об использовании содержащегося элемента без изменения поведения содержащегося элемента.

http://en.wikipedia.org/wiki/Decorator_pattern

43
ответ дан 26 November 2019 в 19:27
поделиться

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

Декораторы позволяют вам прозрачно добавлять функциональность, обычно единственную возможность, к классу без клиентов экземпляров класса, которым необходимо знать, что там есть декоратор - например, декоратор "login_required" в представлении в Django вызывает исключение, если пользователь не вошел в систему, но в противном случае представление ведет себя так же, как и без декоратора.

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

5
ответ дан 26 November 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: