Шаблоны Ruby on Rails - декоратор против презентатора

112

В последнее время в сообществе Ruby on Rails много говорят о декораторах и презентаторах.

В чем существенная разница между ними? Если да, то какие подсказки подсказывают мне, какой из них использовать вместо другого? Или, возможно, использовать их вместе?

керуилин
источник

Ответы:

102

Декоратор - это скорее «давайте добавим функции к этому объекту». Выступающий - это скорее «давайте построим мост между моделью / серверной частью и представлением». Паттерн ведущий имеет несколько интерпретаций.

Декораторы бывают общего назначения. У докладчиков более узкий круг обязанностей / использования. Декораторы используются во всех доменах, презентаторы почти всегда связаны с функциональностью представления.

Дэйв Ньютон
источник
3
Спасибо. Похоже, что самоцвет Draper - гибрид ведущего и декоратора.
keruilin
17
@keruilin Следует иметь в виду одну вещь: декораторы действительно должны иметь возможность украшать другие декораторы (а также украшать объект компонента), потому что одна из их целей - обойти ограничения наследования. (Дрейпер этого не делает). В этом смысле шаблон декоратора очень похож на составной шаблон, за исключением того, что он обрабатывается снаружи внутрь, а не наизнанку (если это имеет смысл).
smudge
7
Я рассматриваю декоратор как шаблон общего назначения, а презентатор - как конкретное приложение декоратора, связанное со слоем представления.
Kris
2
@Smudge, декораторы драпировок могут украшать другие украшения, по крайней мере, как если бы базовые модели имели отношение STI.
keruilin 03
Кажется, теперь Draper идентифицирует себя как оболочку уровня презентации - так что это больше не декоратор, а на самом деле докладчик. Из их GH: «Draper добавляет объектно-ориентированный уровень логики представления в ваше приложение Rails».
Джаред
35

Предлагаю вам проверить это - Exhibit vs Presenter .

Декоратор - это шаблон проектирования, который используется для расширения функциональности определенного объекта путем его обертывания, не влияя на другие экземпляры этого объекта. В общем, шаблон декоратора является примером принципа открытия / закрытия (класс закрыт для модификаций, но доступен для расширений).

Шаблоны экспоната и ведущего являются своего рода шаблоном декоратора.

dpaluy
источник
+1 за ссылку на это сообщение в блоге Майка Пака. Отличный пост, объясняющий различия между шаблонами.
ki4jnq
+1 за упоминание образца экспоната. В итоге я получил книгу Авди Гримма, в которой это объясняется. Хотя это не было правильным решением моей проблемы, это все еще удивительный образец. Отличная пища для размышлений.
Йонк