设计模式-Composite(组合模式)
组合模式
定义:组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构,组合模式能让客户以一致的方式处理个别对象以及对象组合。
自我理解:其实就是把用递归的方法把对象用类似树结构存储起来
<?php /** * 组合模式Composite * case 菜单 或者目录 每个菜单下面可能 有 叶子节点 或者子目录 */ //节点的基类 abstract class NodeBase{ public function add($node){} public function remove($node){} public function getName(){} public function display(){} public function getUrl(){} } class Menu extends NodeBase{ private $_nodes; private $_name; public function __construct($name){ $this->_name = $name; $this->_nodes = new SplObjectStorage(); } public function add($node){ $this->_nodes->attach($node); } public function remove($node){ $this->_nodes->detach($node); } public function getName(){ echo $this->_name."\r\n"; } public function display(){ $this->getName(); foreach ($this->_nodes as $menu){ $menu->display(); } } } class Item extends NodeBase{ private $_name; private $_url; public function __construct($name,$url){ $this->_name = $name; $this->_url = $url; } public function display(){ echo "Name:".$this->_name."||Url:".$this->_url."\r\n"; } } class Client{ private $_menu; public function __construct($menu){ $this->_menu = $menu; } public function setMenu($menu){ $this->_menu = $menu; } public function display(){ $this->_menu->display(); } } //声明Menu $topMenu = new Menu('TopMenu'); $secondLevelOne = new Menu('secondLevelOne'); $secondLevelTwo = new Menu('secondLevelTwo'); $secondLevelThree = new Menu('secondLevelThree'); $thirdLevelOne = new Menu('thirdLevelOne'); //声明节点 $itemOne = new Item('首页','index.php'); $itemtwo = new Item('分类', 'category.php'); $itemThree = new Item('列表','list.php'); //节点挂到对应的menu上面去 $secondLevelOne->add($itemOne); $secondLevelOne->add($itemtwo); $secondLevelOne->add($itemThree); $secondLevelTwo->add($itemOne); $secondLevelTwo->add($itemThree); $thirdLevelOne->add($itemOne); $thirdLevelOne->add($itemThree); $secondLevelOne->add($thirdLevelOne); $topMenu->add($secondLevelOne); $topMenu->add($secondLevelTwo); $topMenu->add($secondLevelThree); $client = new Client($topMenu); $client->display();