Статья
Шаблон проектирования "Декоратор"

Шаблон проектирования "Декоратор"

15 ноября 2017

Пусть имеется интерфейс IceCream и базовый класс BaseIceCream

interface IceCream
{
    public function getDescription();
}

class BaseIceCream implements IceCream
{
    public function getDescription()
    {
        return "Ice cream";
    }
}

 

Расширим функциональность класса:

class IceCreamWithJam implements IceCream
{
    protected $iceCream;

    public function __construct(IceCream $iceCream)
    {
        $this->iceCream = $iceCream;
    }

    public function getDescription()
    {
        return $this->iceCream->getDescription() . ", with jam";
    }
}

class IceCreamWithNuts implements IceCream
{
    protected $iceCream;

    public function __construct(IceCream $iceCream)
    {
        $this->iceCream = $iceCream;
    }

    public function getDescription()
    {
        return $this->iceCream->getDescription() . ", with nuts";
    }
}

 

Использование:

$iceCream = new BaseIceCream();
echo $iceCream->getDescription(); // Ice cream

$iceCream = new IceCreamWithJam($iceCream);
echo $iceCream->getDescription(); // Ice cream, with jam

$iceCream = new IceCreamWithNuts($iceCream);
echo $iceCream->getDescription(); // Ice cream, with jam, with nuts



Источники:

http://designpatternsphp.readthedocs.io/ru/latest/Structural/Decorator/README.html
https://habrahabr.ru/company/mailru/blog/325492/