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 相关文章推荐
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
一个PHP分页类的代码
May 18 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
php创建、获取cookie及基础要点分析
Jan 26 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
Mar 05 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
如何使用纯PHP实现定时器任务(Timer)
Jul 31 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
Smarty模板配置实例简析
Jul 20 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/10/09 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
node app 打包工具pkg的具体使用
2019/01/17 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
HTML5样式控制示例代码
2013/11/27 HTML / CSS
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
什么是规则表达式
2012/05/03 面试题
JAVA招聘远程笔试题
2015/07/23 面试题
应用化学专业职业生涯规划书
2014/01/22 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
施工安全汇报材料
2014/08/17 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android