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?

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.


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.


+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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.