Sobes.tech
Middle

Qu'est-ce qu'un décorateur (Decorator) ?

sobes.tech IA

Réponse de l'IA

Le décorateur est un patron de conception structurel qui permet d’ajouter dynamiquement de nouvelles fonctionnalités à un objet, sans en modifier la structure. Il enveloppe l’objet, en fournissant la même interface que l’objet enveloppé, tout en ajoutant ou modifiant son comportement.

Éléments principaux:

  • Composant (Component): Interface ou classe abstraite définissant la fonctionnalité commune pour les objets enveloppés et les décorateurs.
  • Composant Concret (Concrete Component): Implémentation du composant, objet de base auquel une fonctionnalité est ajoutée.
  • Décorateur (Decorator): Classe abstraite qui implémente l’interface du composant et contient une référence à un objet composant.
  • Décorateur Concret (Concrete Decorator): Implémentation du décorateur qui ajoute une fonctionnalité spécifique avant ou après l’appel de la méthode de l’objet enveloppé.

Exemple en Python:

# Composant
class Coffee:
    def get_cost(self):
        return 5 # Coût de base du café
    
    def get_description(self):
        return "Café simple"

# Composant Concret
class SimpleCoffee(Coffee):
    pass

# Décorateur
class CoffeeDecorator(Coffee):
    def __init__(self, coffee):
        self._coffee = coffee

    def get_cost(self):
        return self._coffee.get_cost()

    def get_description(self):
        return self._coffee.get_description()

# Décorateur Concret
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._coffee.get_cost() + 2 # Ajoute le coût du lait

    def get_description(self):
        return self._coffee.get_description() + ", Lait"

# Utilisation
# simple_coffee = SimpleCoffee()
# print(f"Coût: {simple_coffee.get_cost()}, Description: {simple_coffee.get_description()}")

# coffee_with_milk = MilkDecorator(simple_coffee)
# print(f"Coût: {coffee_with_milk.get_cost()}, Description: {coffee_with_milk.get_description()}")

Avantages:

  • Flexibilité: La fonctionnalité est ajoutée au moment de l’exécution.
  • Évitement des sous-classes: Permet d’éviter la création de nombreuses sous-classes pour chaque combinaison de comportements.
  • Séparation des responsabilités: Chaque ajout de comportement est isolé dans une classe distincte.

Inconvénients:

  • Peut augmenter le nombre de classes.
  • Le débogage peut devenir plus complexe en raison de la chaîne d’enveloppes.