PHP学习心得


组合模式

<ul> <li>将对象组合成树形结构以表示“部分整体”的层次结构。</li> <li>组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式也叫合成模式,有时候又叫做部分-整体模式。</li> </ul> <h3>为什么需要组合模式</h3> <ul> <li>使我们在树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。</li> <li>组合模式让你可以优化处理递归或分级数据结构。</li> </ul> <h3>简单实例</h3> <ul> <li>在做一个OA系统,公司的人事管理该如何设计呢。传统的就是树状结构。经理下面有部门主管,然后是员工。</li> </ul> <h2>代码示例</h2> <pre><code class="language-PHP">&lt;?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 */ abstract class MenuComponent { public function add($component) { } public function remove($component) { } public function getName() { } public function getUrl() { } public function display() { } } class Menu extends MenuComponent { private $_items = array(); private $_name = null; public function __construct($name) { $this-&gt;_name = $name; } public function add($component) { $this-&gt;_items[] = $component; } public function remove($component) { $key = array_search($component, $this-&gt;_items); if ($key !== false) unset($this-&gt;_items[$key]); } public function display() { echo "-- " . $this-&gt;_name . " --------- \r\n "; foreach ($this-&gt;_items as $item) { $item-&gt;display(); } } } class Item extends MenuComponent { private $_name = null; private $_url = null; public function __construct($name, $url) { $this-&gt;_name = $name; $this-&gt;_url = $url; } public function display() { echo $this-&gt;_name . "#" . $this-&gt;_url . " \r\n "; } } class Client { private $_menu = null; public function __construct($menu) { $this-&gt;_menu = $menu; } public function setMenu($menu) { $this-&gt;_menu = $menu; } public function displayMenu() { $this-&gt;_menu-&gt;display(); } } // 实例一下 // 人 $item3 = new Item("baidu", "www.baidu.com"); $item4 = new Item("google", "www.google.com"); $item1 = new Item("163", "www.163.com"); $item2 = new Item("sina", "www.sina.com"); // 班级 $subMenu1 = new Menu("sub menu1"); $subMenu1-&gt;add($item1); $subMenu1-&gt;add($item2); $subMenu2 = new Menu("sub menu2"); $subMenu2-&gt;add($item3); $subMenu2-&gt;add($item4); $subMenu3 = new Menu("sub menu3"); $subMenu3-&gt;add($item3); $subMenu3-&gt;add($item4); // 所有班级 $allMenu = new Menu("All Menu"); $allMenu-&gt;add($subMenu1); $allMenu-&gt;add($subMenu2); $allMenu-&gt;add($subMenu3); // 打印所有班级 $objClient = new Client($allMenu); $objClient-&gt;displayMenu(); // 打印第2 班级 $objClient-&gt;setMenu($subMenu2); $objClient-&gt;displayMenu(); </code></pre>

页面列表

ITEM_HTML