Design patterns: Decorator

Mauto 2 min

Il pattern Decorator 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. zione del coupling (accoppiamento):** Promuove un basso accoppiamento tra le classi, poiché l’astrazione e l’implementazione sono completamente separate. Questo riduce la dipendenza diretta tra componenti.

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
    }
}

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

echo $milkCoffee->cost(); // 7 (5 + 2)

TORNA ALLA GUIDA

content_copy Copiato