В этой статье описывается шаблон проектирования PHP: составной шаблон. Для вашей справки приведем следующие сведения:
1. Обзор
В структуре данных очень важна древовидная структура, мы можем применить древовидную структуру к шаблону проектирования.
Пример 1: это многоуровневое древовидное меню.
Пример 2: каталог файлов и папок
2. Проблемы
Мы можем объединять простые объекты в сложные объекты, и этот сложный объект может быть объединен в более крупные объекты. Мы можем определить эти простые объекты как классы, а затем определить некоторые классы контейнеров для хранения этих простых объектов. Клиентский код должен различать объекты, простые объекты и объекты-контейнеры, когда в большинстве случаев пользователи думают, что они одинаковы. Использование этих классов по-разному делает программу более сложной. Рекурсия-это хлопотно, но как мы можем использовать рекурсивную комбинацию, чтобы пользователям не приходилось различать эти классы?
3. Решения
Шаблон композиции: объединение объектов в древовидную структуру для представления иерархии “часть целого”. Композитный обеспечивает согласованность использования одного объекта и составного объекта.
Иногда это также называют частью целого шаблона. Это делает понятие простого элемента и сложного элемента неясным в проблеме древовидной структуры. Клиентская программа может работать со сложным элементом так же, как и с простым элементом, так что клиентская программа может отделить внутреннюю структуру сложного элемента.
Шаблоны композиции позволяют оптимизировать обработку рекурсивных или иерархических структур данных. Существует множество примеров иерархических структур данных, которые делают составные шаблоны очень полезными. Одним из распространенных примеров иерархических структур данных является то, с чем вы сталкиваетесь каждый раз при использовании компьютера: файловая система. Файловая система состоит из каталогов и файлов. Каждый каталог может содержать содержимое. Содержимое каталога может быть файлом или каталогом. Таким образом, файловая система компьютера организована в рекурсивной структуре. Если вы хотите описать такую структуру данных, вы можете использовать составной шаблон composite.
4. Классификация комбинационных паттернов
1) Определите методы управления дочерними элементами в составном классе 2) Методы управления дочерними элементами определены в интерфейсе компонента, так что конечному классу необходимо очистить реализацию этих методов.
5. Применимость
Составной режим применим в следующих случаях:
1) . вы хотите представить частичную глобальную иерархию объектов
2) Вы хотите, чтобы пользователи игнорировали разницу между составными объектами и отдельными объектами, и пользователи будут использовать все объекты в структуре композиции равномерно.
6. Структура
Типичная структура составного объекта показана на следующем рисунке:
7. Состав режима строительства
Абстрактный компонент: Является интерфейсом объявления объекта в композиции и, при необходимости, реализует поведение интерфейса по умолчанию, общее для всех классов. Объявите интерфейс для доступа к узлам компонентов и управления ими.
Этот интерфейс можно использовать для управления всеми дочерними объектами. (необязательно) определите интерфейс в рекурсивной структуре для доступа к родительскому компоненту и реализуйте его при необходимости.
Роль компонента листа: Объект конечного узла представлен в дереве композиции, и конечный узел не имеет дочерних узлов. И определите поведение примитивных объектов в композиции. Роль компонента филиала (составная) Определяет поведение тех деталей, которые имеют подсборки. Узлы хранения. Реализуйте операции, связанные с субкомпонентами, в интерфейсе компонентов. Клиент: Через интерфейс компонента для управления объектом компонента.
8. Эффект
1) определяет иерархию классов, содержащую базовые объекты и составные объекты. Базовые объекты могут быть объединены в более сложные составные объекты, а составные объекты могут быть объединены, что может быть рекурсивно продолжено. В коде клиента составные объекты могут использоваться везде, где используются базовые объекты. 2) упрощение кода клиента, клиенты могут последовательно использовать составные структуры и отдельные объекты. Обычно пользователи не знают (и им все равно), имеют ли они дело с конечным узлом или составным компонентом. Это упрощает код заказчика, поскольку нет необходимости писать функции, полные операторов выбора, в классах, определяющих состав. 3) облегчите добавление новых типов компонентов. Вновь определенный составной или конечный подкласс автоматически работает с существующей структурой и клиентским кодом, и клиентская программа не нуждается в изменении новым классом компонентов. 4) сделайте свой дизайн более общим и простым, добавление новых компонентов также вызовет некоторые проблемы, то есть трудно ограничить компоненты в композиции. Иногда вы хотите, чтобы комбинация состояла только из определенных компонентов. В случае composite вы не можете полагаться на систему типов для наложения этих ограничений, но вы должны проверить это во время выполнения.
9. Реализация
Классическим примером является древовидное меню. Многоуровневый дисплей, это меню может добавлять неограниченное количество узлов; исключение составляет обход файлов и так далее.
php /** *Combination mode * * @author guisu * @version 1.0 *Combination mode:树形菜单 * *The objects are combined into a tree structure to represent the "part whole" hierarchy, which makes the use of single objects and composite objects consistent */ /** *Abstract component * */ abstract class MenuComponent { public function add($component){} public function remove($component){} public function getName(){} public function getUrl(){} public function displayOperation(){} } /** *Branch component role (composite) * */ class MenuComposite extends MenuComponent { private $_items = array(); private $_name = null; private $_align = ''; public function __construct($name) { $this->_name = $name; } public function add($component) { $this->_items[$component->getName()] = $component; } public function remove($component) { $key = array_search($component,$this->_items); if($key !== false) unset($this->_items[$key]); } public function getItems() { return $this->_items; } public function displayOperation() { static $align = '|'; if($this->getItems()) { //substr($align, strpos($align,)); $align .= ' _ _ '; }else{ $align .=''; } echo $this->_name, "
"; foreach($this->_items as $name=> $item) { echo $align; $item->displayOperation(); } } public function getName(){ return $this->_name; } } /** *Leaf component role * */ class ItemLeaf extends MenuComponent { private $_name = null; private $_url = null; //public $_align = '----'; public function __construct($name,$url) { $this->_name = $name; $this->_url = $url; } public function displayOperation() { echo '' , $this->_name, '
'; } public function getName(){ return $this->_name; } } class Client { public static function displayMenu() { $subMenu1 = new MenuComposite("submenu1"); $subMenu2 = new MenuComposite("submenu2"); $subMenu3 = new MenuComposite("submenu3"); $subMenu4 = new MenuComposite("submenu4"); $subMenu5 = new MenuComposite("submenu5"); /* $item1 = new ItemLeaf("sohu","www.163.com"); $item2 = new ItemLeaf("sina","www.sina.com"); $subMenu4 = new MenuComposite("submenu4"); $subMenu1->add($subMenu4); $subMenu4->add($item1); $subMenu4->add($item2); */ $item3 = new ItemLeaf("baidu","www.baidu.com"); $item4 = new ItemLeaf("google","www.google.com"); $subMenu2->add($item3); $subMenu2->add($item4); $allMenu = new MenuComposite("AllMenu"); $allMenu->add($subMenu1); $allMenu->add($subMenu2); $allMenu->add($subMenu3); $subMenu3->add($subMenu4); $subMenu4->add($subMenu5); $allMenu->displayOperation(); } } //Create menu Client::displayMenu(); ?>
10. Комбинированный режим и другие связанные режимы
1) Режим декоратора часто используется с составным режимом. Когда украшения и комбинации используются вместе, они
Обычно существует общий родительский класс. Поэтому украшение должно поддерживать интерфейсы компонентов с операциями добавления, удаления и получения.
2) Режим Flyweight позволяет совместно использовать компоненты, но больше не ссылаться на их родителей.
3) (шаблон итератора) итератор может использоваться для обхода композита.
4) Посетитель локализует операции и поведение, которые должны были быть распределены в составных и конечных классах.
11. Резюме
Шаблон композиции разделяет внутреннюю структуру клиентской программы и сложные элементы, так что клиентская программа может работать как со сложными элементами, так и с простыми элементами.
Если вы хотите создать иерархию, в которой все элементы могут обрабатываться одинаково, идеально подходят составные шаблоны.
Подробнее о содержании, связанном с PHP заинтересованные читатели могут ознакомиться с этой темой сайта: “Вводный учебник по объектно-ориентированному программированию PHP”, “Навыки работы с массивом PHP (массивом)”, “Вводный курс по основному синтаксису PHP”, “Краткое описание операций и использования операторов PHP”, “Краткое описание использования символьной строки (строки) PHP”, “Учебник по введению в работу с базой данных PHP + MySQL” и “Общая работа с базой данных PHP”. Краткое изложение навыков письма
Я надеюсь, что эта статья поможет вам в программировании на PHP.