Padrões Ruby on Rails - decorador vs apresentador

112

Fala-se muito ultimamente na comunidade Ruby on Rails sobre decoradores e apresentadores.

Qual é a diferença essencial entre os dois? Se houver, quais são as pistas que me dizem qual usar em vez da outra? Ou talvez para usar os dois em conjunto?

Keruilin
fonte

Respostas:

102

Um decorador é mais um "vamos adicionar algumas funcionalidades a esta entidade". Um apresentador é mais um "vamos construir uma ponte entre o modelo / back-end e a visualização". O padrão do apresentador tem várias interpretações.

Decoradores são genéricos / de uso geral. Os apresentadores têm uma gama mais restrita de responsabilidades / usos. Decoradores são usados ​​em vários domínios, os apresentadores quase sempre estão relacionados à funcionalidade de visualização.

Dave Newton
fonte
3
Obrigado. Parece que a gema Draper é um híbrido de apresentador e decorador.
keruilin
17
@keruilin Uma coisa para se manter em mente: os decoradores devem realmente ser capazes de decorar outros decoradores (assim como decorar o objeto componente), porque um de seus objetivos é contornar as limitações de herança. (Draper não faz isso). O padrão do decorador é muito semelhante ao padrão composto nesse sentido, exceto quando tratado de fora para dentro em vez de de dentro para fora (se isso fizer sentido).
borrar
7
Eu vejo um decorador como um padrão de uso geral e o apresentador como uma aplicação específica de decorador relacionada à camada de visualização.
Kris
2
@Smudge, decoradores draper podem decorar outras decorações, pelo menos como se os modelos subjacentes tivessem um relacionamento STI.
Keruilin
Parece que agora Draper se identifica como o wrapper da camada de apresentação - então não é mais um decorador, mas um apresentador na verdade. De seu GH: "Draper adiciona uma camada orientada a objetos de lógica de apresentação para seu aplicativo Rails."
Jared
35

Eu sugiro que você verifique isto - Exposição vs Apresentador .

Decorator é um padrão de design usado para estender a funcionalidade de um objeto específico envolvendo-o, sem afetar outras instâncias desse objeto. Em geral, o padrão decorator é um exemplo do princípio de abrir / fechar (a classe é fechada para modificações, mas disponível para extensões).

Os padrões de exibição e de apresentador são uma espécie de padrão do decorador.

dpaluy
fonte
+1 por vincular a essa postagem de blog de Mike Pack. Excelente post que explica as diferenças entre os padrões.
ki4jnq
1 por mencionar o padrão de exibição. Acabei pegando o livro de Avdi Grimm que explica tudo. Embora não fosse a solução certa para o meu problema, ainda é um padrão incrível. Excelente alimento para o pensamento.
Yonk de