Maison  >  Article  >  Java  >  Modèle de décorateur

Modèle de décorateur

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-05 03:40:02148parcourir

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

Decorator Pattern

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.

Decorator Pattern

  • 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn