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).
Utilisez le modèle Decorator lorsque vous souhaitez construire un objet en ajoutant de petits comportements au moment de l'exécution.
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.
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.
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!