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源代码
Oct 09 PHP
模仿OSO的论坛(三)
Oct 09 PHP
重新认识php array_merge函数
Aug 31 PHP
C/S和B/S两种架构区别与优缺点分析
Oct 23 PHP
PHP中生成UUID自定义函数分享
Jun 10 PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
PHP模拟http请求的方法详解
Nov 09 PHP
PHP实现二维数组按某列进行排序的方法
Nov 18 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
Oct 26 PHP
PHP学习笔记之session
May 06 PHP
PHP以json或xml格式返回请求数据的方法
May 31 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
javascript 控制弹出窗口
2007/04/10 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
python条件和循环的使用方法
2013/11/01 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
中专生的个人自我评价
2013/12/11 职场文书
小学生植树节活动总结
2014/07/04 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
2015年度党员个人总结
2015/02/14 职场文书
2015年电教工作总结
2015/05/26 职场文书
建党伟业电影观后感
2015/06/01 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
学校远程教育工作总结
2015/08/11 职场文书
乔迁新居祝福语
2019/11/04 职场文书
详解在OpenCV中如何使用图像像素
2022/03/03 Python
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL