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 相关文章推荐
理解PHP5中static和const关键字的区别
Mar 19 PHP
PHP中文汉字验证码
Apr 08 PHP
PHP 危险函数解释 分析
Apr 22 PHP
PHP生成随机字符串(3种方法)
Sep 25 PHP
php远程下载类分享
Apr 13 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
Dec 25 PHP
php pdo操作数据库示例
Mar 10 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
使用laravel指定日志文件记录任意日志
Oct 17 PHP
PHP如何防止用户重复提交表单
Dec 09 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中的字符串函数
2006/11/24 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
ReactJs设置css样式的方法
2017/06/08 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
python支付宝支付示例详解
2019/08/22 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
Python如何获取文件路径/目录
2020/09/22 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
公安学专业求职信
2014/07/27 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
初中家长评语大全
2014/12/26 职场文书
护理工作个人总结
2015/03/03 职场文书
结婚司仪主持词
2015/06/29 职场文书
九年级历史教学反思
2016/02/19 职场文书
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android