Middle
Cos'è un decoratore (Decorator) nel contesto della programmazione e come viene utilizzato?
sobes.tech AI
Risposta dell'AI
Il decoratore è un pattern di progettazione strutturale che consente di aggiungere dinamicamente un nuovo comportamento o responsabilità agli oggetti senza modificare la loro struttura.
Idee principali:
- Avvolge un oggetto esistente, ampliandone la funzionalità.
- Mantiene l'interfaccia dell'oggetto avvolto, garantendo l'intercambiabilità.
- Evita la proliferazione di gerarchie di classi quando si aggiungono nuove combinazioni di comportamenti.
Utilizzo:
- Estensione della funzionalità "al volo": Si applica quando si desidera aggiungere o modificare il comportamento di un oggetto durante l'esecuzione del programma.
- Alternativa all'ereditarietà: Invece di creare sottoclassi per ogni combinazione di comportamenti, si usano i decoratori. È un approccio più flessibile.
- Combinazione di comportamenti: Diversi decoratori possono essere applicati allo stesso oggetto in ordini diversi, creando combinazioni uniche.
Esempio in Python:
# Componente di base
class Component:
def operation(self):
pass
# Componente concreto
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Decoratore di base (memorizza un riferimento all'oggetto avvolto)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Decoratore concreto A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Decoratore concreto B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Utilizzo
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))
Esempio in Python come zucchero sintattico @:
def my_decorator(func):
def wrapper():
print("Prima della funzione")
func()
print("Dopo la funzione")
return wrapper
@my_decorator
def say_hello():
print("Ciao!")
say_hello()
# Output:
# Prima della funzione
# Ciao!
# Dopo la funzione