Шаблоны 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 .

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

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


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

+1 за упоминание образца экспоната. В итоге я получил книгу Авди Гримма, в которой это объясняется. Хотя это не было правильным решением моей проблемы, это все еще удивительный образец. Отличная пища для размышлений.
Йонк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.