J'étudiais le modèle de décorateur tel que documenté dans GOF .
S'il vous plaît, aidez-moi à comprendre le modèle de décorateur . Quelqu'un pourrait-il donner un exemple de cas d'utilisation où cela est utile dans le monde réel?
decorator
design-patterns
odiseh
la source
la source
Réponses:
Prenons le cas d'une pizzeria. Dans la pizzeria, ils vendront quelques variétés de pizzas et ils fourniront également des garnitures dans le menu. Imaginez maintenant une situation dans laquelle si la pizzeria doit fournir des prix pour chaque combinaison de pizza et de garniture. Même s'il y a quatre pizzas de base et 8 garnitures différentes, l'application deviendrait folle en conservant toutes ces combinaisons concrètes de pizzas et de garnitures.
Voici le motif du décorateur.
Selon le modèle du décorateur, vous mettrez en œuvre des garnitures au fur et à mesure que les décorateurs et les pizzas seront décorées par les décorateurs de ces garnitures. Pratiquement chaque client voudrait des garnitures de son désir et le montant final de la facture sera composé des pizzas de base et des garnitures commandées en plus. Chaque décorateur de garniture connaîtrait les pizzas qu'il décore et son prix. La méthode GetPrice () de l'objet Topping renverrait le prix cumulé de la pizza et de la garniture.
ÉDITER
Voici un exemple de code d'explication ci-dessus.
la source
Il s'agit d'un exemple simple d'ajout dynamique d'un nouveau comportement à un objet existant ou au modèle Decorator. En raison de la nature des langages dynamiques tels que Javascript, ce modèle devient une partie du langage lui-même.
la source
switch
ou d'un simpleif
, vous pourrez affirmer qu'il s'agit d'un excellent exemple d'ajout dynamique de comportement à une classe.Mais, nous avons besoin d'au moins deux classes pour définir un décorateur et des objets décorés dans ce modèle.Il convient de noter que le modèle d'E / S Java est basé sur le modèle de décorateur. La superposition de ce lecteur au-dessus de ce lecteur au-dessus de ... est un exemple vraiment réel de décorateur.
la source
Exemple - Scénario - Disons que vous écrivez un module de chiffrement. Ce cryptage peut crypter le fichier clair à l'aide de la norme de cryptage DES - Data. De même, dans un système, vous pouvez avoir le cryptage en tant que norme de cryptage AES - Advance. En outre, vous pouvez avoir la combinaison de cryptage - d'abord DES, puis AES. Ou vous pouvez avoir d'abord AES, puis DES.
Discussion - Comment allez-vous gérer cette situation? Vous ne pouvez pas continuer à créer l'objet de telles combinaisons - par exemple - AES et DES - total de 4 combinaisons. Ainsi, vous devez avoir 4 objets individuels. Cela deviendra complexe à mesure que le type de cryptage augmentera.
Solution - Continuez à construire la pile - des combinaisons en fonction des besoins - au moment de l'exécution. Un autre avantage de cette approche par pile est que vous pouvez la dérouler facilement.
Voici la solution - en C ++.
Tout d'abord, vous avez besoin d'une classe de base - une unité fondamentale de la pile. Vous pouvez penser comme la base de la pile. Dans cet exemple, il s'agit d'un fichier clair. Suivons toujours le polymorphisme. Faites d'abord une classe d'interface de cette unité fondamentale. De cette façon, vous pouvez l'implémenter comme vous le souhaitez. De plus, vous n'avez pas besoin de penser à la dépendance tout en incluant cette unité fondamentale.
Voici la classe d'interface -
Maintenant, implémentez cette classe d'interface -
Maintenant, créons une classe abstraite de décorateur - qui peut être étendue pour créer n'importe quel type de saveurs - ici, la saveur est le type de cryptage. Cette classe abstraite de décorateur est liée à la classe de base. Ainsi, le décorateur "est une" sorte de classe d'interface. Ainsi, vous devez utiliser l'héritage.
Maintenant, faisons une classe de décorateur concrète - Type de chiffrement - AES -
Maintenant, disons que le type de décorateur est DES -
const std :: string desEncrypt = "DES Encrypted";
Créons un code client pour utiliser cette classe de décorateur -
Vous verrez les résultats suivants -
Voici le diagramme UML - Représentation de classe de celui-ci. Dans le cas où vous souhaitez ignorer le code et vous concentrer sur l'aspect de conception.
la source
strategy pattern
?Le modèle Decorator vous aide à modifier ou configurer une fonctionnalité de votre objet en enchaînant avec d'autres sous-classes similaires de cet objet.
Le meilleur exemple serait les classes InputStream et OutputStream dans le package java.io
la source
Qu'est-ce que Decorator Design Pattern en Java.
La définition formelle du modèle Decorator du livre du GoF (Design Patterns: Elements of Reusable Object-Oriented Software, 1995, Pearson Education, Inc. Publishing as Pearson Addison Wesley) indique que vous pouvez,
"Attachez dynamiquement des responsabilités supplémentaires à un objet. Les décorateurs offrent une alternative flexible au sous-classement pour étendre les fonctionnalités."
Disons que nous avons une pizza et que nous voulons la décorer avec des garnitures telles que le poulet masala, l'oignon et le fromage mozzarella. Voyons comment l'implémenter en Java ...
Programme pour montrer comment implémenter Decorator Design Pattern en Java.
Pizza.java:
la source
J'ai beaucoup utilisé le motif Decorator dans mon travail. J'ai publié un article sur mon blog sur la façon de l'utiliser avec la journalisation.
la source
Prenons un exemple où vous devez créer une application qui calcule le prix de différents types de hamburgers. Vous devez gérer différentes variantes de hamburgers, tels que «gros» ou «avec du fromage», dont chacun a un prix par rapport au hamburger de base. Par exemple, ajoutez 10 $ pour un hamburger avec du fromage, ajoutez 15 $ de plus pour un gros hamburger, etc.
Dans ce cas, vous pourriez être tenté de créer des sous-classes pour les gérer. Nous pourrions exprimer cela en Ruby comme suit:
Dans l'exemple ci-dessus, la classe BurgerWithCheese hérite de Burger et remplace la méthode de prix pour ajouter 15 $ au prix défini dans la super classe. Vous créeriez également une classe LargeBurger et définiriez le prix par rapport à Burger. Mais vous devez également définir une nouvelle classe pour la combinaison de «gros» et «avec fromage».
Maintenant, que se passe-t-il si nous devons servir un "hamburger avec frites"? Nous avons déjà 4 classes pour gérer ces combinaisons, et nous devrons en ajouter 4 supplémentaires pour gérer toutes les combinaisons des 3 propriétés - «grande», «avec fromage» et «avec frites». Nous avons besoin de 8 classes maintenant. Ajoutez une autre propriété et nous aurons besoin de 16. Cela deviendra 2 ^ n.
Essayons plutôt de définir un BurgerDecorator qui prend en charge un objet Burger:
Dans l'exemple ci-dessus, nous avons créé une classe BurgerDecorator, dont la classe BurgerWithCheese hérite. Nous pouvons également représenter la «grande» variation en créant la classe LargeBurger. Maintenant, nous pourrions définir un gros hamburger avec du fromage à l'exécution comme:
Rappelez-vous comment l'utilisation de l'héritage pour ajouter la variante "avec frites" impliquerait l'ajout de 4 sous-classes supplémentaires? Avec les décorateurs, nous créerions simplement une nouvelle classe, BurgerWithFries, pour gérer la nouvelle variante et gérer cela au moment de l'exécution. Chaque nouvelle propriété aurait besoin d'un peu plus de décorateur pour couvrir toutes les permutations.
PS. Ceci est la version courte d'un article que j'ai écrit sur l' utilisation du modèle de décorateur en Ruby , que vous pouvez lire si vous souhaitez découvrir des exemples plus détaillés.
la source
Décorateur:
Se référer à la fabrication de sources article pour plus de détails.
Decorator (Abstract) : c'est une classe / interface abstraite, qui implémente l'interface du composant. Il contient l'interface des composants. En l'absence de cette classe, vous avez besoin de nombreuses sous-classes de ConcreteDecorators pour différentes combinaisons. La composition du composant réduit les sous-classes inutiles.
Exemple JDK:
Jetez un œil à la question SE ci-dessous pour des exemples de diagramme et de code UML.
Motif décorateur pour IO
Articles utiles:
journaldev
Wikipédia
Exemple de mot réel de modèle de décorateur: VendingMachineDecorator a été expliqué @
Quand utiliser le motif décorateur?
Dans l'exemple ci-dessus, le thé ou le café (boisson) a été décoré par Sugar and Lemon.
la source
Le modèle de décorateur atteint un seul objectif d' ajouter dynamiquement des responsabilités à n'importe quel objet .
Le modèle d'E / S Java est basé sur un modèle de décorateur.
la source
Il existe un exemple sur Wikipedia sur la décoration d'une fenêtre avec une barre de défilement:
http://en.wikipedia.org/wiki/Decorator_pattern
Voici un autre exemple très «réel» de «membre d'équipe, chef d'équipe et gestionnaire», qui illustre que le modèle de décorateur est irremplaçable avec un simple héritage:
https://zishanbilal.wordpress.com/2011/04/28/design-patterns-by-examples-decorator-pattern/
la source
Il y a quelque temps, j'avais refactoré une base de code en utilisant le modèle Decorator, donc je vais essayer d'expliquer le cas d'utilisation.
Supposons que nous ayons un ensemble de services et que l'utilisateur ait acquis ou non une licence d'un service particulier, nous devons démarrer le service.
Tous les services ont une interface commune
Pré refactoring
Si vous observez attentivement,
ServiceSupport
dépend deLicenseManager
. Mais pourquoi devrait-il en dépendreLicenseManager
? Et si nous avions besoin d'un service d'arrière-plan qui n'a pas besoin de vérifier les informations de licence. Dans la situation actuelle, nous devrons en quelque sorte nous entraînerLicenseManager
pour revenirtrue
aux services d'arrière-plan. Cette approche ne me paraissait pas bien. Selon moi, le contrôle de licence et les autres logiques étaient orthogonaux les uns par rapport aux autres.Donc, modèle de décorateur vient à la rescousse et commence ici la refactorisation avec TDD.
Refactoring de poste
À emporter
la source
Prenons l'exemple de PubG. Les fusils d'assaut fonctionnent mieux avec un zoom 4x et pendant que nous y sommes, nous aurions également besoin d'un compensateur et d'un suppresseur. Cela réduira le recul et réduira le son de tir ainsi que l'écho. Nous devrons implémenter cette fonctionnalité qui permettra aux joueurs d'acheter leur arme préférée et leurs accessoires. Les joueurs peuvent acheter le pistolet ou une partie de l'accessoire ou tout l'accessoire et ils seraient facturés en conséquence.
Voyons comment le motif décorateur est appliqué ici:
Supposons que quelqu'un veuille acheter SCAR-L avec les trois accessoires mentionnés ci-dessus.
Cela conduira à un diagramme de classes comme celui-ci:
Maintenant, nous pouvons avoir des classes comme celle-ci:
Nous pouvons également ajouter d'autres accessoires et décorer notre pistolet.
Référence:
https://nulpointerexception.com/2019/05/05/a-beginner-guide-to-decorator-pattern/
la source
Modèle de conception de décorateur : ce modèle permet de modifier les caractéristiques d'un objet lors de l'exécution. Il fournit différentes saveurs à un objet et donne la flexibilité de choisir les ingrédients que nous voulons utiliser dans cette saveur.
Exemple réel: disons que vous avez un siège principal dans la cabine d'un vol. Vous êtes désormais autorisé à choisir plusieurs équipements avec le siège. Chaque équipement a son propre coût qui lui est associé. Désormais, si un utilisateur choisit le Wifi et la nourriture premium, il / elle sera facturé pour siège + wifi + nourriture premium.
Dans ce cas, le modèle de conception de décorateur peut vraiment nous aider. Visitez le lien ci-dessus pour en savoir plus sur le modèle de décorateur et la mise en œuvre d'un exemple réel.
la source