组合模式是一系列对象组合成树形结构来表示整体和部分之间的关系,组合模式的主要目的是达到,访问组合对象和访问单个对象具有一致性。

这里的组合对象比较特殊,本身可以是由其他的对象组合而成,同事,这个组合对象又可以组成更复杂对象的一部分。

  • 抽象角色(MenuComponent):给参加组合的对象规定统一的接口,接口中包括管理节点的方法,如add、remove,可以定义一些接口的默认动作
  • 树叶组件(Leaf)角色:在组合中表示为叶节点对象,叶节点没有子节点。在组合中定义图元对象的行为
  • 树枝组件(Composite)角色:存储子部件,定义子部件的部件行为,实现与子部件相关的操作。
/**
*Composite Pattern 组合模式
*/abstract class MenuComponent
{public $name;public abstract function getName();public abstract function add($menu);public abstract function remove($menu);public abstract function getChild($i);public abstract function show();
}
/**
*菜单项目
*/
class MenuItem extends MenuComponent
{public function __construct($name){$this->name = $name;}public function getName(){return $this->name;}public function add($menu){return false;}public function remove($menu){return false;}public function getChild($i){return NULL;}public function show(){echo '|-' . $this->getName() . "\n";}
}
/**
*菜单
*/
class Menu extends MenuComponent
{public $menuComponents = array();public function __construct($name){$this->name = $name;}public function getName(){return $this->name;}public function add($menu){$this->menuComponents[] = $menu;}public function remove($menu){$key = array_search($menu, $this->menuComponents);if($key !== false){unset($this->menuComponetns[$key]);}}public function getChild($i){if(isset($this->menuComponents[$i])){return $this->menuComponents[$i];}}public function show(){echo ':' . $this->getName() . "\n";foreach($this->menuComponents as $v){$v->show();}}
}//使用
class  Client
{public static function main(){$menu = new Menu('编程语言');$menuitem1 = new MenuItem('Java');$menuitem2 = new MenuItem('C#');$menuitem3 = new MenuItem('PHP');$menu->add($menuitem1);$menu->add($menuitem2);$menu->add($menuitem3);$menu->show();}
}Client::main();

PHP设计模式之组合模式(Composite Pattern)相关推荐

  1. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  2. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

  3. C#设计模式——组合模式(Composite Pattern)

    一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...

  4. 设计模式:组合模式(Composite Pattern)

    组合模式: 又叫部分整体模式, 它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系. JDK中的HashMap就使用了组合模式 public abstra ...

  5. 设计模式之组合模式(Composite)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示"部分-整体"的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字"树形".这种树形结构在现实 ...

  7. 24组合模式(Composite Pattern)

    动机(Motivate):     组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元 ...

  8. 研磨设计模式 之 组合模式(Composite) 3——跟着cc学设计系列

    15.3  模式讲解 15.3.1  认识组合模式 (1)组合模式的目的 组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作. 实现这个目标的关键之处,是设计一 ...

  9. 研磨设计模式 之 组合模式(Composite) 2——跟着cc学设计系列

    15.2  解决方案 15.2.1  组合模式来解决 用来解决上述问题的一个合理的解决方案就是组合模式.那么什么是组合模式呢? (1)组合模式定义 (2)应用组合模式来解决的思路 仔细分析上面不用模式 ...

  10. 组合模式(Composite Pattern)

    组合模式概述 定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式让客户端可以统一对待单个对象和组合对象.又被成为"部分-整体"(Part-Whole)模式, ...

最新文章

  1. 快速开发rails、==常用插件==
  2. VirtualBox上装CentOS5.8网络不通问题
  3. RDKit | 分子坐标的测量和绘图
  4. 11.系统安全分析与设计
  5. 3页论文被引用17915次!88岁物理学泰斗温伯格去世,霍金《时间简史》受他启发...
  6. 企业网络推广专员浅析有利于企业网络推广的页面制作技巧有哪些?
  7. Web前端技术分享:img标签与background插入图片的区别
  8. java 对 mongoDB 分组统计操作 以及一些常用操作
  9. String、String Buffer、StringBuilder区别与比较
  10. gcc代码反汇编查看内存分布[2]: arm-linux-gcc
  11. Google Guava新手教程
  12. nfa状态转换图正规式_0x02 从NFA到DFA
  13. android物理健代码,Android 物理按键整理及实例代码
  14. 1313 质因数分解
  15. PLSQL创建DBLINK
  16. 字更大、页面更简单 淘宝长辈模式正式上线
  17. Intel VT-x 处于禁用解决方法
  18. sqlserver2012安装教程
  19. 企业级多用户发卡平台源码
  20. 项目管理实战课程总结

热门文章

  1. 机器学习类别/标称(categorical)数据处理:目标编码(target encoding)
  2. python使用正则表达式抽取字符串中最大数值数字
  3. exit语句php,php or die() 语句,exit()
  4. 综述 | 语言分析技术在社会计算中的应用
  5. Moving Towards Third‐Generation Sequencing Technologies 迈向第三代测序技术
  6. matlab如求曲线插值点,两条曲线之间的插值(matlab)
  7. STM32-USART控制led和蜂鸣器
  8. python 打包wheel文件,自己的SDK包
  9. UnicodeEncodeError: ‘locale‘ codec can‘t encode character ‘\u5e74‘ in position 2: Illegal byte seque
  10. No module named ‘win32gui’ 以及 No module named ‘win32console’解决办法