Design patterns: Decorator

data: · 2 min
autore: Mauto
serie: Design Patterns/ parte 10/24

I pattern classici della Gang of Four, uno per puntata, con esempi pratici in PHP.

  1. Design Patterns
  2. Design patterns: Singleton
  3. Design patterns: Factory Method
  4. Design patterns: Abstract Factory
  5. Design patterns: Builder
  6. Design patterns: Prototype
  7. Design patterns: Adapter
  8. Design patterns: Bridge, cos’è e come usarlo (esempio PHP)
  9. Design patterns: Composite
  10. Design patterns: Decorator
  11. Design patterns: Facade, cos’è e come usarlo (esempio PHP)
  12. Design patterns: Flyweight
  13. Design patterns: Proxy
  14. Design patterns: Chain of Responsibility, cos’è (esempio PHP)
  15. Design patterns: Command
  16. Design patterns: Interpreter
  17. Design patterns: Iterator
  18. Design patterns: Mediator
  19. Design patterns: Memento
  20. Design patterns: Observer
  21. Design patterns: State, cos’è e come usarlo (esempio PHP)
  22. Design patterns: Strategy
  23. Design patterns: Template Method
  24. Design patterns: Visitor
tutta la guida >

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:

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

Copiato