Middle
Qu'est-ce qu'un décorateur (Decorator) dans le contexte de la programmation et comment est-il utilisé?
sobes.tech IA
Réponse de l'IA
Le décorateur est un patron de conception structurel qui permet d’ajouter dynamiquement un comportement ou des responsabilités nouvelles aux objets sans modifier leur structure.
Idées principales :
- Enveloppe un objet existant, en étendant sa fonctionnalité.
- Maintient l’interface de l’objet enveloppé, assurant l’interchangeabilité.
- Évite la prolifération des hiérarchies de classes lors de l’ajout de nouvelles combinaisons de comportements.
Utilisation :
- Extension de la fonctionnalité "à la volée" : Utilisée lorsque vous souhaitez ajouter ou modifier le comportement d’un objet pendant l’exécution du programme.
- Alternative à l’héritage : Au lieu de créer des sous-classes pour chaque combinaison de comportements, on utilise des décorateurs. C’est une approche plus flexible.
- Combinaison de comportements : Différents décorateurs peuvent être appliqués au même objet dans des ordres différents, créant des combinaisons uniques.
Exemple en Python :
# Composant de base
class Component:
def operation(self):
pass
# Composant concret
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Décorateur de base (stocke une référence à l’objet enveloppé)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Décorateur concret A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Décorateur concret B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Utilisation
simple = ConcreteComponent()
print(simple.operation()) # ConcreteComponent
decorated_a = ConcreteDecoratorA(simple)
print(decorated_a.operation()) # ConcreteDecoratorA(ConcreteComponent)
decorated_b_a = ConcreteDecoratorB(decorated_a)
print(decorated_b_a.operation()) # ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
Exemple en Python comme sucre syntaxique @ :
def my_decorator(func):
def wrapper():
print("Avant la fonction")
func()
print("Après la fonction")
return wrapper
@my_decorator
def say_hello():
print("Bonjour!")
say_hello()
# Sortie :
# Avant la fonction
# Bonjour!
# Après la fonction