php设计模式 Composite (组合模式)


Posted in PHP onJune 26, 2011
<?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->_name = $name; 
} 
public function add($component) 
{ 
$this->_items[] = $component; 
} 
public function remove($component) 
{ 
$key = array_search($component,$this->_items); 
if($key !== false) unset($this->_items[$key]); 
} 
public function display() 
{ 
echo "-- ".$this->_name." ---------<br/>"; 
foreach($this->_items as $item) 
{ 
$item->display(); 
} 
} 
} 
class Item extends MenuComponent 
{ 
private $_name = null; 
private $_url = null; 
public function __construct($name,$url) 
{ 
$this->_name = $name; 
$this->_url = $url; 
} 
public function display() 
{ 
echo $this->_name."#".$this->_url."<br/>"; 
} 
} 
class Client 
{ 
private $_menu = null; 
public function __construct($menu) 
{ 
$this->_menu = $menu; 
} 
public function setMenu($menu) 
{ 
$this->_menu = $menu; 
} 
public function displayMenu() 
{ 
$this->_menu->display(); 
} 
} 
// 实例一下 
// 创建menu 
$subMenu1 = new Menu("sub menu1"); 
$subMenu2 = new Menu("sub menu2"); 
$subMenu3 = new Menu("sub menu3"); 
$item1 = new Item("163","www.163.com"); 
$item2 = new Item("sina","www.sina.com"); 
$subMenu1->add($item1); 
$subMenu1->add($item2); 
$item3 = new Item("baidu","www.baidu.com"); 
$item4 = new Item("google","www.google.com"); 
$subMenu2->add($item3); 
$subMenu2->add($item4); 
$allMenu = new Menu("All Menu"); 
$allMenu->add($subMenu1); 
$allMenu->add($subMenu2); 
$allMenu->add($subMenu3); 
$objClient = new Client($allMenu); 
$objClient->displayMenu(); 
$objClient->setMenu($subMenu2); 
$objClient->displayMenu();
PHP 相关文章推荐
开发大型PHP项目的方法
Oct 09 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
PHP响应post请求上传文件的方法
Dec 17 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
Feb 06 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP实现的数据对象映射模式详解
Mar 20 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 PHP
php设计模式 State (状态模式)
Jun 26 #PHP
php设计模式 Bridge (桥接模式)
Jun 26 #PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 #PHP
php设计模式 FlyWeight (享元模式)
Jun 26 #PHP
php设计模式 Mediator (中介者模式)
Jun 26 #PHP
php设计模式 Prototype (原型模式)代码
Jun 26 #PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 #PHP
You might like
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
将php数组输出html表格的方法
2014/02/24 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
jQuery :first选择器使用介绍
2013/08/09 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
vue.js初学入门教程(2)
2016/11/07 Javascript
nodejs基础知识
2017/02/03 NodeJs
js鼠标移动时禁止选中文字
2017/02/19 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python简单读取json文件功能示例
2017/11/30 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
django基于restframework的CBV封装详解
2019/08/08 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
python 8种必备的gui库
2020/08/27 Python
python unichr函数知识点总结
2020/12/16 Python
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
自我鉴定思想方面
2013/10/07 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
个人银行贷款担保书
2014/04/01 职场文书
新课培训心得体会
2014/09/03 职场文书
表扬通报怎么写
2015/01/16 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
小学中队活动总结
2015/05/11 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers