-1
votes

Le motif de décorateur est-il vraiment nécessaire ici?

J'apprends le modèle de conception de décorateur à partir du premier livre de modèles de conception de la tête. Leur exemple traite différents types de cafés en tant que boisson. Les boissons sont décorées de choses comme du lait, du soja, de la crème fouettée, etc. Par exemple, le café Darkroast avec moka et crème de fouet: Exemple de décorateur

Le diagramme de la classe: diagramme de classe

Je comprends que cet exemple est utilisé uniquement parce que c'est simple. Mais j'ai un moyen alternatif et plus simple d'implémenter cet exemple sans motif de décorateur. Nous pouvons avoir une classe d'articles avec description et des coûts. Ensuite, la classe de boissons peut avoir basocoster, totalcost et liste d'articles.

Cette conception alternative présente-t-elle des inconvénients majeurs sur le motif de décorateur? Pouvez-vous donner des scénarios spécifiques où le motif de décorateur serait meilleur que mon design?

PS - Au cas où n'importe qui veut voir le code de décorateur: https://github.com/bethrobson/head-first-design-patterns/tree/master/src/headfirst/designpatterns/decorator/starbuzz


2 commentaires

90% de ce que vous faites avec des décorateurs peut être fait par d'autres moyens. C'est une question de la lisibilité, de la convivialité et de l'abstraction.


Une liste introduit une mutabilité, tandis que le motif de décorateur permet la personnalisation d'exécution tout en préservant l'immuabilité.


3 Réponses :


0
votes

Ici fondamentalement une boisson spécifique est représentée par une liste liée des ingrédients. La méthode getDescription () crée de la représentation de chaîne de la boisson.

Dans ce cas simple, c'est probablement bien, mais s'il existe de nombreux ingrédients, éventuellement avec une quantité variable, une autre structure de données pourrait être meilleure (peut-être une sorte de hashtable, mais il existe de nombreuses autres possibilités).

Par exemple, la quantité est représentée par des éléments dupliqués (il n'y a donc aucune fraction), voir par exemple le duplicata moka dans boisson2 dans starbuzzcoffee.java.

Vous pouvez décider quelle solution est préférable en tenant compte de la surcharge de la gestion d'une autre structure de données, vs Simplicité d'une liste liée, gardant à l'esprit que la liste liée peut être cosy s'il y a de nombreux articles, surtout si vous avez besoin au hasard. accès aux éléments. Exemple: vous avez besoin de O (n) boucles (où n est la taille de la liste) pour vérifier si une boisson a un ingrédient donné, beaucoup moins avec la haquetable. Mais pour le faible n, la solution avec une hache peut être plus lente car c'est une structure de données plus compliquée.

La réponse à votre question dépend du contexte, mais de manière générale, il n'y a rien de mal à une autre approche.


0 commentaires

1
votes

Ce exemple est principalement sur Comment utiliser le motif de décorateur

Les motifs peuvent être un sujet complexe et savoir quand forts> pour les utiliser est parfois plus compliqué que la compréhension comment forte> pour les utiliser p> blockQuote>

Voir autre Exemples comme Mat CODE>, où vous avez STROND> Ajoutez FORT> Fonctionnalité à l'objet, par exemple Couleur: P>

public class Mat extends ImageDecorator {
   String color;

   public Mat(String color, PhotoImage target) {
         super(target);
         this.color = color;
   }

   @Override
   public String getDescription() {
        return target.getDescription() + ", Matted(" + color + ")";
   } 


0 commentaires

0
votes

Dans l'exemple, il est possible d'avoir le même comportement sans motif de décorateur. Je conviens ce que tout le monde a déjà dit. Bien sûr, l'exemple est fabriqué pour apprendre à travailler avec des décorateurs et à reconnaître le motif.

Je voudrais ajouter un point ici comment je vois ce problème. (Parce que vous avez dit que vous appreniez le modèle)

Lorsque vous utilisez un motif de décorateur, cela ne fait probablement rien de plus qu'une autre implémentation. Quoi qu'il en soit, la prestation est d'utiliser un modèle connu et vous avez «un mot» pour décrire la mise en œuvre. Habituellement, cela est important lorsque vous travaillez avec des équipes à cause de ce que vous pouvez décrire efficacement les détails de la mise en œuvre. (lorsque d'autres développeurs connaissent également le modèle)

Lorsque vous utilisez votre propre façon de mettre en œuvre le comportement, il faut généralement du temps pour discuter de la façon dont cela fonctionne.

deuxième avantage est le problème que le motif de décorateur essaie de résoudre. Modèle de décorateur - Wikipedia

  • Les responsabilités doivent être ajoutées à (et supprimées de) un objet de manière dynamique au moment de l'exécution.
  • Une alternative flexible au sous-classement pour l'extension de la fonctionnalité doit être fournie.

    Je le mentionne car l'utilisation du motif peut être très utile lorsque vous travaillez avec le code hérité / code inconnu. Habituellement, vous avez besoin de ce type d'astuce pour ajouter de nouveaux comportements sans modifier la mise en œuvre initiale.


0 commentaires