PHP设计模式之组合模式定义与应用示例


Posted in PHP onFebruary 01, 2020

本文实例讲述了PHP设计模式之组合模式定义与应用。分享给大家供大家参考,具体如下:

<?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 . " --------- \r\n ";
    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 . " \r\n ";
  }
}
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();
  }
}
// 实例一下
// 人
$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->add($item1);
$subMenu1->add($item2);
$subMenu2 = new Menu("sub menu2");
$subMenu2->add($item3);
$subMenu2->add($item4);
$subMenu3 = new Menu("sub menu3");
$subMenu3->add($item3);
$subMenu3->add($item4);
// 所有班级
$allMenu = new Menu("All Menu");
$allMenu->add($subMenu1);
$allMenu->add($subMenu2);
$allMenu->add($subMenu3);
// 打印所有班级
$objClient = new Client($allMenu);
$objClient->displayMenu();
// 打印第2 班级
$objClient->setMenu($subMenu2);
$objClient->displayMenu();
?>

运行结果:

-- All Menu ---------
 -- sub menu1 ---------
 163#www.163.com 
 sina#www.sina.com
 -- sub menu2 ---------
 baidu#www.baidu.com
 google#www.google.com
 -- sub menu3 ---------
 baidu#www.baidu.com
 google#www.google.com
 -- sub menu2 ---------
 baidu#www.baidu.com
 google#www.google.com

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php pack与unpack 摸板字符字符含义
Oct 29 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 PHP
解析ajax事件的调用顺序
Jun 17 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
Aug 25 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 PHP
深入理解PHP JSON数组与对象
Jul 19 PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
Smarty模板类内部原理实例分析
Jul 03 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
php实现的简单多进程服务器类完整示例
Feb 01 #PHP
laravel 框架执行流程与原理简单分析
Feb 01 #PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 #PHP
php正则表达式使用方法整理集合
Jan 31 #PHP
laravel邮件发送的实现代码示例
Jan 31 #PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 #PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 #PHP
You might like
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
js中this的用法实例分析
2015/01/10 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
使用webpack和rollup打包组件库的方法
2021/02/25 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
python 调用c语言函数的方法
2017/09/29 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
Python实现Restful API的例子
2019/08/31 Python
python计算无向图节点度的实例代码
2019/11/22 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
铁路工务反思材料
2014/02/07 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
2014年环卫工作总结
2014/11/22 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers