Sobes.tech
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:

  1. Estensione della funzionalità "al volo": Si applica quando si desidera aggiungere o modificare il comportamento di un oggetto durante l'esecuzione del programma.
  2. Alternativa all'ereditarietà: Invece di creare sottoclassi per ogni combinazione di comportamenti, si usano i decoratori. È un approccio più flessibile.
  3. 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