InformaticaPHPProgrammazioneSviluppo

Come usare un Decoratore in PHP

Un decoratore è un design pattern che consente di aggiungere funzionalità aggiuntive o modificare il comportamento di un oggetto senza dover modificare la sua struttura di base. Il decoratore si basa sul concetto di composizione anziché sull’ereditarietà, consentendo di avvolgere un oggetto all’interno di un altro oggetto che aggiunge o modifica il suo comportamento.

Il vantaggio principale dell’utilizzo del design pattern del decoratore è la flessibilità che offre nel modificare il comportamento di un oggetto in modo dinamico a runtime, senza alterare la struttura dell’oggetto stesso. Ciò significa che è possibile combinare diversi decoratori per ottenere combinazioni di funzionalità diverse, a seconda delle esigenze.

Vediamo come usare un Decoratore in PHP:

<?php

// Interfaccia del componente (frutta)
interface Frutta {
    public function getDescrizione(): string;
    public function getPrezzo(): float;
}

// Implementazione del componente base (frutta senza decorazioni)
class FruttaBase implements Frutta {
    protected $descrizione;
    protected $prezzo;

    public function getDescrizione(): string {
        return $this->descrizione;
    }

    public function getPrezzo(): float {
        return $this->prezzo;
    }
}

// Decoratore concreto (decorazione di base)
class DecoratoreBase implements Frutta {
    protected $frutta;

    public function __construct(Frutta $frutta) {
        $this->frutta = $frutta;
    }

    public function getDescrizione(): string {
        return $this->frutta->getDescrizione();
    }

    public function getPrezzo(): float {
        return $this->frutta->getPrezzo();
    }
}

// Decoratore concreto (decorazione con zucchero)
class DecoratoreZucchero extends DecoratoreBase {
    public function getDescrizione(): string {
        return parent::getDescrizione() . ", zucchero";
    }

    public function getPrezzo(): float {
        return parent::getPrezzo() + 0.5;
    }
}

// Decoratore concreto (decorazione con cioccolato)
class DecoratoreCioccolato extends DecoratoreBase {
    public function getDescrizione(): string {
        return parent::getDescrizione() . ", cioccolato";
    }

    public function getPrezzo(): float {
        return parent::getPrezzo() + 1.0;
    }
}

// Utilizzo dei componenti e dei decoratori
$frutta = new FruttaBase();
$fruttaConZucchero = new DecoratoreZucchero($frutta);
$fruttaConCioccolato = new DecoratoreCioccolato($fruttaConZucchero);

// Chiamata ai metodi del componente decorato
echo $fruttaConCioccolato->getDescrizione(); // Stampa: "Frutta, zucchero, cioccolato"
echo $fruttaConCioccolato->getPrezzo(); // Stampa: 1.5


Nell’esempio della frutta, il decoratore consente di aggiungere decorazioni come lo zucchero o il cioccolato a una frutta di base. Se si volesse aggiungere una nuova decorazione, come ad esempio la cannella, sarebbe sufficiente creare un nuovo decoratore e avvolgere l’oggetto frutta con esso, senza dover modificare la struttura del componente base o degli altri decoratori esistenti.

/ 5
Grazie per aver votato!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *