В чем разница между композитным рисунком и рисунком декоратора?
Разница между композитным рисунком и рисунком декоратора?
Ответ 1
Они обычно идут рука об руку. В том, что использование составного рисунка часто приводит к использованию также рисунка декоратора.
Составной шаблон позволяет вам построить иерархическую структуру (например, дерево элементов) таким образом, чтобы ваш внешний код мог просматривать всю структуру как единый объект. Таким образом, интерфейс к листовому объекту точно такой же, как и объект для составного объекта. Поэтому суть состоит в том, что все элементы в вашей составной структуре имеют один и тот же интерфейс, хотя некоторые из них являются узлами листа, а другие - целыми структурами. Пользовательские интерфейсы часто используют этот подход для упрощения компоновки.
http://en.wikipedia.org/wiki/Composite_pattern
Шаблон декоратора позволяет сущности полностью содержать другой объект, так что использование декоратора выглядит идентично содержащемуся объекту. Это позволяет декоратору изменять поведение и/или содержимое того, что он инкапсулирует, не изменяя внешний вид объекта. Например, вы можете использовать декоратор для добавления вывода журнала на использование содержащегося элемента без изменения поведения содержащегося элемента.
Ответ 2
Структура составного рисунка и декоратора выглядит одинаково, но у них разные намерения.
Композитный дает унифицированный интерфейс для листа и композита.
ДекораторDecorator предоставляет дополнительную возможность листать, предоставляя унифицированный интерфейс.
Примеры
Составной паттерн: классические папки и файлы Windows. Папки Windows - это композиты. файлы - это листья. Двойной щелчок по любому из них открывает файл/папку - двойной щелчок - это унифицированный интерфейс.
Рисунок декоратора: буферизованные io - java.io.FileWriter
и java.io.BufferedWriter
расширяют java.io.Writer
. java.io.BufferedWriter
является составным и FileWriter
является листом. BufferedWriter
добавляет дополнительную ответственность (или функцию) буферизации к FileWriter
.
write()
- унифицированный интерфейс, а буферизация - дополнительная функция.
Ответ 3
Декоратор можно рассматривать как вырожденный композит только с одним компонентом. Однако декоратор добавляет дополнительные обязанности - он не предназначен для агрегации объектов.
Это то, что сказано в "Шаблонах проектирования - Элементы многоразового объектно-ориентированного программного обеспечения" группой из четырех человек.
Ответ 4
Разница, вероятно, более важна, чем реализация. В некоторых случаях составной шаблон предпочтительнее для подкласса. Например, вы можете добавить функциональность, которой должен обладать класс, добавляя к нему экземпляры других классов, а затем раскрывая функциональность через интерфейс пересылки.
Декораторы позволяют вам прозрачно добавлять функциональность, обычно одну возможность, в класс без клиентов экземпляров класса, которые должны знать, что там есть декоратор - например, "декоратор" login_required "на представлении в Django вызывает исключение, если пользователь не вошел в систему, но в противном случае представление ведет себя так же, как и без декоратора.
В обоих случаях у вас есть один объект, встроенный в другой, но то, что вы пытаетесь выполнить, возможно, отличается.
Ответ 5
Различия в структуре
Вот диаграммы классов из книги GoF, воспроизведенные с помощью PlantUML.
Различия в намерении
Цель Decorator состоит в том, чтобы украсить один компонент (диаграмма UML действительно должна отображать множество для декорированного компонента), тогда как цель Composite состоит в том, чтобы группировать компоненты в целом в Composite (опять же, UML должен содержать композит, содержащий один или несколько Компонентов).
Decorator имеет цель добавить поведение (улучшить поведение метода Operation()
) с помощью ConcreteDecorators, тогда как Composite нацелен на сбор компонентов.
Ответ 6
Decorator шаблон может использоваться для расширения (украшения) функций определенного объекта статически или в некоторых случаях при запуске -time, независимо от других экземпляров того же класса.
Это возможно из-за композиции: Decorator содержит компонент и в то же время реализует компонентный интерфейс.
Шаблон Composite описывает, что группу объектов нужно обрабатывать так же, как один экземпляр объекта. Цель композита состоит в том, чтобы "компонировать" объекты в древовидных структурах, чтобы представлять иерархии целого целого.
Реализация составного шаблона позволяет клиентам обрабатывать отдельные объекты и композиции равномерно.
Несмотря на то, что структура, похоже, одинакова, намерения и варианты использования различны.
Используйте случаи для Decorator pattern:
- Обязанности и поведение объекта должны динамически добавляться/удаляться
- Конкретные реализации должны быть отделены от обязанностей и поведения Подкласс
- слишком дорогостоящий, чтобы динамически добавлять/удалять обязанности.
Ключевые различия между этими двумя шаблонами:
- Decorator предназначен для добавления обязанностей к объектам без подкласса. Композитный фокус не предназначен для украшения, а для представления
- Decorator добавляет/удаляет дополнительные обязанности - он не предназначен для агрегации объектов.
Полезные сообщения в SE для лучшего понимания:
Ответ 7
Композитный:
- Является структурой дерева с использованием рекурсии.
- Лист и композит имеют одинаковый интерфейс
- Единство между объектами
Decorator:
- Есть другой объект.
- Добавление новых функциональных возможностей в составной объект без его модификации.