# Design patterns: Decorator

> Decorator design pattern con esempi in PHP

- URL: https://mautoblog.com/posts/design-patterns/decorator/
- Lingua: it
- Pubblicato: 2024-09-27
- Aggiornato: 2026-10-14
- Autore: Mauto
- Categorie: Sviluppo Software, Tecnologia
- Tags: Architettura Software, Best Practices, PHP
- Guida: Design Patterns (parte 10)
- Traduzione (en): https://mautoblog.com/en/posts/design-patterns/decorator/

---
Il pattern Decorator è un design pattern strutturale che permette di aggiungere comportamenti a un oggetto in modo dinamico.

## Caratteristiche del Decorator pattern
1. **Aggiunta dinamica di Comportamenti:** Il Decorator Pattern consente di aggiungere nuovi comportamenti e responsabilità agli oggetti esistenti in modo dinamico, senza alterare il codice originale.
2. **Composizione Flessibile:** Permette di combinare diversi decorator per estendere le funzionalità di un oggetto, offrendo una grande flessibilità nella creazione di comportamenti complessi.
3. **Rispetto del Principio di apertura/chiusura:** Segue il principio di apertura/chiusura, permettendo di estendere le funzionalità degli oggetti senza modificare il codice esistente. Puoi aggiungere decorator senza cambiare le classi originali.
4. **Supporto per Oggetti complessi:** Rende facile gestire oggetti con molte variazioni e opzioni, consentendo di creare configurazioni complesse senza la necessità di una gerarchia di classi statica.
5. **Interfaccia unificata:** Gli oggetti decorati e gli oggetti originali implementano la stessa interfaccia, permettendo ai client di utilizzare oggetti decorati e non decorati in modo intercambiabile, senza preoccuparsi delle differenze di implementazione.

### Esempio in PHP:

```php
interface Coffee {
    public function cost();
}

class BasicCoffee implements Coffee {
    public function cost() {
        return 5;
    }
}

class MilkDecorator implements Coffee {
    private $coffee;

    public function __construct(Coffee $coffee) {
        $this->coffee = $coffee;
    }

    public function cost() {
        return $this->coffee->cost() + 2; // Aggiunge il costo del latte
    }
}

class SugarDecorator implements Coffee {
    private $coffee;

    public function __construct(Coffee $coffee) {
        $this->coffee = $coffee;
    }

    public function cost() {
        return $this->coffee->cost() + 1; // Aggiunge il costo dello zucchero
    }
}

// Utilizzo
$basicCoffee = new BasicCoffee();
$milkCoffee = new MilkDecorator($basicCoffee);

echo $milkCoffee->cost() . "\n"; // 7 (5 + 2)

// I decorator si possono combinare: latte e zucchero
$milkSugarCoffee = new SugarDecorator(new MilkDecorator(new BasicCoffee()));

echo $milkSugarCoffee->cost() . "\n"; // 8 (5 + 2 + 1)
```

[TORNA ALLA GUIDA](/posts/design-patterns/)

