Подтвердить что ты не робот

Разница между композитным рисунком и рисунком декоратора?

В чем разница между композитным рисунком и рисунком декоратора?

4b9b3361

Ответ 1

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

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

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

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

http://en.wikipedia.org/wiki/Decorator_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.

GoF Decorator class diagram

GoF Composite class diagram

Различия в намерении

Цель Decorator состоит в том, чтобы украсить один компонент (диаграмма UML действительно должна отображать множество для декорированного компонента), тогда как цель Composite состоит в том, чтобы группировать компоненты в целом в Composite (опять же, UML должен содержать композит, содержащий один или несколько Компонентов).

Decorator имеет цель добавить поведение (улучшить поведение метода Operation()) с помощью ConcreteDecorators, тогда как Composite нацелен на сбор компонентов.

Ответ 6

Decorator шаблон может использоваться для расширения (украшения) функций определенного объекта статически или в некоторых случаях при запуске -time, независимо от других экземпляров того же класса.

Это возможно из-за композиции: Decorator содержит компонент и в то же время реализует компонентный интерфейс.

Шаблон Composite описывает, что группу объектов нужно обрабатывать так же, как один экземпляр объекта. Цель композита состоит в том, чтобы "компонировать" объекты в древовидных структурах, чтобы представлять иерархии целого целого.

Реализация составного шаблона позволяет клиентам обрабатывать отдельные объекты и композиции равномерно.

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

Используйте случаи для Decorator pattern:

  • Обязанности и поведение объекта должны динамически добавляться/удаляться
  • Конкретные реализации должны быть отделены от обязанностей и поведения Подкласс
  • слишком дорогостоящий, чтобы динамически добавлять/удалять обязанности.

Ключевые различия между этими двумя шаблонами:

  • Decorator предназначен для добавления обязанностей к объектам без подкласса. Композитный фокус не предназначен для украшения, а для представления
  • Decorator добавляет/удаляет дополнительные обязанности - он не предназначен для агрегации объектов.

Полезные сообщения в SE для лучшего понимания:

Рисунок декоратора для IO

Когда использовать шаблон декоратора?

Ответ 7

Композитный:

  • Является структурой дерева с использованием рекурсии.
  • Лист и композит имеют одинаковый интерфейс
  • Единство между объектами

Decorator:

  • Есть другой объект.
  • Добавление новых функциональных возможностей в составной объект без его модификации.