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:
P>
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. P>
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? P>
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 P>
3 Réponses :
Ici fondamentalement une boisson spécifique est représentée par une liste liée des ingrédients. La méthode 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). P>
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 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. P>
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. P> getDescription () code> crée de la représentation de chaîne de la boisson. P>
moka code> dans boisson2 code> dans starbuzzcoffee.java. p>
Ce exemple est principalement sur Comment utiliser le motif de décorateur Les motifs peuvent être un sujet complexe et savoir 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 + ")";
}
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. p>
Je voudrais ajouter un point ici comment je vois ce problème. (Parce que vous avez dit que vous appreniez le modèle) p>
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) P>
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. P>
deuxième avantage est le problème que le motif de décorateur essaie de résoudre. Modèle de décorateur - Wikipedia P>
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. P>
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é.