Patrons Ruby on Rails - décorateur vs présentateur

112

Il y a toutes sortes de discussions récemment dans la communauté Ruby on Rails sur les décorateurs et les présentateurs.

Quelle est la différence essentielle entre les deux? S'il y en a, quels sont les indices qui me disent lequel utiliser par rapport à l'autre? Ou peut-être utiliser les deux en conjonction?

kéruiline
la source

Réponses:

102

Un décorateur est plus un "ajoutons des fonctionnalités à cette entité". Un présentateur est plus un "construisons un pont entre le modèle / backend et la vue". Le modèle de présentateur a plusieurs interprétations.

Les décorateurs sont génériques / à usage général. Les présentateurs ont un éventail plus restreint de responsabilités / utilisations. Les décorateurs sont utilisés dans tous les domaines, les présentateurs sont presque toujours liés aux fonctionnalités de type affichage.

Dave Newton
la source
3
Merci. On dirait que le joyau de Draper est un hybride de présentateur et de décorateur.
keruilin
17
@keruilin Une chose à garder à l'esprit: les décorateurs devraient vraiment être capables de décorer d'autres décorateurs (ainsi que de décorer l'objet composant), car l'un de leurs objectifs est de contourner les limites de l'héritage. (Draper ne fait pas cela). Le motif décorateur est très similaire au motif composite en ce sens, sauf qu'il est géré de l'extérieur vers l'intérieur au lieu de l'intérieur vers l'extérieur (si cela a du sens).
smudge
7
Je vois un décorateur comme un motif à usage général et un présentateur comme une application spécifique de décorateur liée à la couche de vue.
Kris
2
@Smudge, les décorateurs de drapiers peuvent décorer d'autres décorations, du moins comme si les modèles sous-jacents avaient une relation STI.
keruilin
Il semble que maintenant Draper s'identifie comme un wrapper de couche de présentation - donc ce n'est plus un décorateur, mais un présentateur en fait. D'après leur GH: "Draper ajoute une couche de logique de présentation orientée objet à votre application Rails."
Jared
35

Je vous suggère de vérifier ceci - Exposition vs Présentateur .

Decorator est un modèle de conception utilisé pour étendre la fonctionnalité d'un objet spécifique en l'enveloppant, sans affecter les autres instances de cet objet. En général, le modèle décorateur est un exemple du principe d'ouverture / fermeture (la classe est fermée pour les modifications, mais disponible pour les extensions).

Les modèles d'exposition et de présentateur sont une sorte de modèle de décorateur.

dpaluy
la source
+1 pour créer un lien vers ce billet de blog par Mike Pack. Excellent article qui explique les différences entre les modèles.
ki4jnq
+1 pour mentionner le modèle d'exposition. J'ai fini par obtenir le livre d'Avdi Grimm qui l'explique. Bien que ce ne soit pas la bonne solution pour mon problème, c'est toujours un modèle incroyable. Excellente matière à réflexion.
Yonk