Modèle de décorateur
Qu’est-ce que le motif décorateur ?
Le modèle de décorateur est un modèle de conception structurelle qui attache dynamiquement des comportements supplémentaires à un objet. Les décorateurs fournissent une extension flexible par composition plutôt que par sous-classement (héritage).
Quand l'utiliser ?
Utilisez le modèle Decorator lorsque vous souhaitez construire un objet en ajoutant de petits comportements au moment de l'exécution.
Diagramme UML
La classe Décorateur utilise la composition et l'héritage, il est crucial de comprendre leur intention.
Dans le modèle Décorateur, nous utilisons le même type pour les composants et les décorateurs. Le décorateur compose l'objet Component pour obtenir le comportement, c'est-à-dire l'obtention de champs ou de méthodes définis dans l'objet Component. Tandis que Decorator hérite (étend) du composant afin que l'objet Decorator puisse être déclaré comme objet Component.
Le motif décoratif réalise le principe ouvert-fermé, à savoir ouvert pour l'extension et fermé pour la modification. Il est facile d'ajouter des composants ou des décorateurs. par exemple, si vous souhaitez ajouter un autre décorateur concret, il vous suffit de créer une classe le représentant et d'étendre la classe Decorator.
Exemple
Imaginez que nous développons un système pour un glacier. Le magasin propose diverses glaces et garnitures. Le système doit afficher une description de la glace (y compris ses garnitures) et son coût.
- Les composants (crèmes glacées) et les décorateurs (garnitures) ont une classe d'interface IceCream commune, ils se déclarent tous deux comme objet IceCream.
- Chaque glace en béton remplace la méthode de coût puisque les prix sont différents pour chacune.
- La classe Topping fournit une interface pour les garnitures en béton et contient une référence à une glace.
- Si le système a besoin d'une autre garniture, par exemple une source de caramel, ce que vous devez faire est simplement de créer la classe CaramelSource qui étend la classe Topping.
Implémentation en Java
Cours de glace :
// Component class public abstract class IceCream { public String description = "Unknown ice cream"; public String getDescription() { return description; } public abstract double cost(); }
Cours ChocolatGlace :
// Concrete component class public class ChocolateIceCream extends IceCream { public ChocolateIceCream() { description = "ChocolateIceCream"; } @Override public double cost() { return 1.99; } }
Classe de garniture :
// Base decorator class public abstract class Topping extends IceCream { public IceCream iceCream; // All subclasses (concrete decorator classes) need to implement getDescription method, // by declaring this method as abstract, we enforce all subclasses to implement this method public abstract String getDescription(); }
Cours MapleNuts :
// Concrete decorator class public class MapleNuts extends Topping { public MapleNuts(IceCream iceCream) { this.iceCream = iceCream; } @Override public String getDescription() { return iceCream.getDescription() + ", MapleNuts"; } @Override public double cost() { return iceCream.cost() + .30; } }
Classe PeanutButterShell :
// Concrete decorator class public class PeanutButterShell extends Topping { public PeanutButterShell(IceCream iceCream) { this.iceCream = iceCream; } @Override public String getDescription() { return iceCream.getDescription() + ", PeanutButterShell"; } @Override public double cost() { return iceCream.cost() + .30; } }
Classe client :
public class Client { public static void main(String[] args) { IceCream iceCream = new ChocolateIceCream(); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); iceCream = new MapleNuts(iceCream); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); iceCream = new PeanutButterShell(iceCream); System.out.println(iceCream.getDescription() + ", $" + iceCream.cost()); } }
Sortie :
ChocolateIceCream, .99 ChocolateIceCream, MapleNuts, .29 ChocolateIceCream, MapleNuts, PeanutButterShell, .59
Vous pouvez consulter toutes les implémentations de modèles de conception ici.
Dépôt GitHub
P.S.
Je suis nouveau dans l'écriture d'un blog technique, si vous avez des conseils pour améliorer mon écriture ou si vous avez un point déroutant, veuillez laisser un commentaire !
Merci d'avoir lu :)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...

Explication détaillée de la conception des tables SKU et SPU sur les plates-formes de commerce électronique Cet article discutera des problèmes de conception de la base de données de SKU et SPU dans les plateformes de commerce électronique, en particulier comment gérer les ventes définies par l'utilisateur ...
