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 相关文章推荐
MySQL相关说明
Jan 15 PHP
php中fsockopen用法实例
Jan 05 PHP
php创建session的方法实例详解
Jan 27 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
twig模板常用语句实例小结
Feb 04 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
实例分析PHP中PHPMailer发邮件
Dec 13 PHP
ThinkPHP 3使用OSS的方法
Jul 19 PHP
PHP连续签到功能实现方法详解
Dec 04 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
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
php fread读取文件注意事项
2016/09/24 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
Grid得到选择行数据的方法总结
2011/01/17 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
python直接访问私有属性的简单方法
2016/07/25 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Python之京东商品秒杀的实现示例
2021/01/06 Python
校园达人秀策划书
2014/01/12 职场文书
临床医师个人自我评价
2014/04/06 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript