Шаблон Composite (Компоновщик)
09-08-2019Reading time ~ 2 min.PHP/ООП 6670
Основной смысл паттерна в том, чтобы позволить вначале создать коллекцию объектов классов, а после их выполнить скопом. Какое-то практическое применение Composite в PHP найти сложно, разве что для решения задач, когда требуется выполнить сразу много действий из разных классов.
Для компоновщика важно обеспечить строгое соответствие одному типу данных. Поэтому вначале создается интерфейс, который уже реализуется каждым классом. Это гарантирует, что в них будут присутствовать общие методы.
Рабочий пример я разместил на гитхабе. Рассмотрим его работу.
Класс Composite - основной, он является непосредственным компоновщиком объектов. Классы Class1 и Class2 также реализуют интерфейс CompositeInterface, а значит у них будет метод run()
. После создания объекта Composite с помощью метода addClass()
мы добавляем в него созданные объекты.
В компоновщике также можно добавить методы для удаления классов, или организовать древовидную структуру — тут многое зависит от задачи.
После того, как все объекты добавлены, компоновщик запускает метод run()
, который запускает этот метод у всех добавленных классов.
Класс компоновщика Composite не обязательно должен реализовывать интерфейс CompositeInterface.
В чём плюсы шаблона? Все подключаемые классы имеют единый интерфейс, то есть «совместимы» между собой. В компоновщике мы не задаем последовательность выполнения классов (как например в Facade), то есть логика выполнения лежит на внешнем уровне, где мы добавляем классы.
Когда станет задача исключить выполнение какого-то класса, достаточно его не добавлять в компоновщик. И обратно — если нужно добавить новую операцию, то создаем класс и регистрируем его в компоновщике.
ничего не понимаю, очень сложно