GOF рекомендует, чтобы все классы в этом шаблоне были производными от одного абстрактного класса компонентов. Вы можете получить класс из существующего класса, чтобы добавить эту функциональность в класс DynamicComponent для того же эффекта. Вы извлекаете внутренние объекты из этого класса. В этом классе можно использовать магические методы для динамической обработки свойств и маршрутизации сообщений. Вам понадобятся __get (), _ set (), _call () и, возможно ,__construct (). Я использую фабричный метод с защищенными конструкторами для имитации множественного наследования. Фабрика возвращает автономный компонент или упакованный компонент (обычно по указанию построителя коллекции, например, построителя дерева, который получает свои данные из базы данных, например).
Функциональность обёртывания происходит в абстрактном классе, также производном от общего класса компонентов.
Вы предоставляете реализации каждого метода в общем интерфейсе. Эти переопределяющие функции синхронизируют данные во внутреннем элементе и внешнем элементе и обеспечивают проводку для передачи необработанных сообщений во внутренний элемент. По сути, каждый класс, участвующий в этом шаблоне, автоматически получает базовые функции __get () и __set () от родительского, а расширенные - от inner_item. Они связаны в абстрактном классе для отправки сообщений своим аналогам inner_item.
Конкретная оболочка получает интерфейс компонента бесплатно от своего родителя и может сосредоточиться на добавленной функциональности. Если вы хотите избавиться от общего родителя, то общий интерфейс необходимо будет повторно реализовать в каждом конкретном классе-обертке. Еще одним преимуществом является возможность добавлять функции, такие как сравнение и __toString () в базовый класс. Объекты могут использоваться полностью взаимозаменяемо в таких функциях, как usort () и других структурах list / tree / stack / cue / array / любых других, потому что они не просто выглядят как один и тот же интерфейс, они одного типа!