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

Шаблон проектирования "Компоновщик"

20 ноября 2017

Пусть имеется интерфейс Animal и 2 класса животных - Parrot и Crocodile, реализующих интерфейс Animal:

interface Animal
{
    public function __construct($name);
    public function getName();
    public function setWeight($weight);
    public function getWeight();
}

class Parrot implements Animal
{
    protected $weight;
    protected $name;

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

    public function getName()
    {
        return $this->name;
    }

    public function setWeight($weight)
    {
        $this->weight = $weight;
    }

    public function getWeight()
    {
        return $this->weight;
    }
}

class Crocodile implements Animal
{
    protected $weight;
    protected $name;

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

    public function getName()
    {
        return $this->name;
    }

    public function setWeight($weight)
    {
        $this->weight = $weight;
    }

    public function getWeight()
    {
        return $this->weight;
    }
}

 

Создадим класс Zoo, состоящий из разных животных и подсчитаем общий вес животных:

class Zoo
{
    protected $animals;

    public function addAnimal(Animal $animal)
    {
        $this->animals[] = $animal;
    }

    public function getTotalWeight()
    {
        $weight = 0;
        foreach ($this->animals as $animal) {
            $weight += $animal->getWeight();
        }
        return $weight;
    }
}


// Создаем животных
$gena = new Crocodile('Gennadiy', 120);
$kesha = new Parrot('Kesha', 0.5);

// Добавляем животных в зоопарк
$zoo = new Zoo();
$zoo->addAnimal($gena);
$zoo->addAnimal($kesha);

echo "Total weight: " . $zoo->getTotalWeight(); // 120.5



Источники:

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