声明:本系列博客参考资料《大话设计模式》,作者程杰。

组合模式(有时候又叫做部分-整体模式),将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

实现类图:

三大角色:

抽象结构(Company)角色:此角色实现所有类共有接口的默认行为,声明一个接口管理子部件。

叶子节点(Technology)角色:表示叶子对象,没有子节点。

枝节点(SubCompany)角色:用来存储子部件,实现与子部件有关的操作,如Add()等。

实现代码:

<?php
/*** Created by PhpStorm.* User: Jiang* Date: 2015/5/2* Time: 21:14*//**抽象结构角色          公司* Class Company*/
abstract class Company
{protected $name;function __construct($name){$this->name=$name;}/**增加* @param Company $company    子公司,部门* @return mixed*/abstract function Add(Company $company);/**移除* @param Company $company   子公司,部门* @return mixed*/abstract function Remove(Company $company);/**显示公司及部门结构* @param $depth* @return mixed*/abstract function Display($depth);}/**枝节点               子公司* Class Beijing*/
class SubCompany extends Company
{private $sub_companys=array();function __construct($name){parent::__construct($name);}function Add(Company $company){$this->sub_companys[]=$company;}function Remove(Company $company){$key=array_search($company,$this->sub_companys);if($key!==false){unset($this->sub_companys[$key]);}}function Display($depth){$pre="";for($i=0;$i<$depth;$i++){$pre.="-";}$pre.=$this->name."<br/>";echo $pre;foreach($this->sub_companys as $v){$v->Display($depth+2);}}}/**叶子节点                    财务部* Class DeptCompany*/
class MoneyDept extends Company
{function __construct($name){parent::__construct($name);}/**增加* @param Company $company 子公司,部门* @return mixed*/function Add(Company $company){echo "叶子节点,不能继续添加节点。。。。。。。。。。<br/>";}/**移除* @param Company $company 子公司,部门* @return mixed*/function Remove(Company $company){echo "叶子节点,不能删除节点。。。。。。。。。。<br/>";}/**显示公司及部门结构* @param $depth* @return mixed*/function Display($depth){$pre="";for($i=0;$i<$depth;$i++){$pre.="-";}$pre.=$this->name."<br/>";echo $pre;}}/**叶子节点                    技术部门* Class DeptCompany*/
class TechnologyDept extends Company
{function __construct($name){parent::__construct($name);}/**增加* @param Company $company 子公司,部门* @return mixed*/function Add(Company $company){echo "叶子节点,不能继续添加节点。。。。。。。。。。<br/>";}/**移除* @param Company $company 子公司,部门* @return mixed*/function Remove(Company $company){echo "叶子节点,不能删除节点。。。。。。。。。。<br/>";}/**显示公司及部门结构* @param $depth* @return mixed*/function Display($depth){$pre="";for($i=0;$i<$depth;$i++){$pre.="-";}$pre.=$this->name."<br/>";echo $pre;}}

测试代码:

header("Content-Type:text/html;charset=utf-8");
//------------------------组合器模式测试代码------------------
require_once "./Composer/Composer.php";$root=new SubCompany("北京总公司");
$root->Add(new MoneyDept("总公司财务部"));
$root->Add(new TechnologyDept("总公司技术部"));$shanghai=new SubCompany("上海分公司");
$shanghai->Add(new TechnologyDept("上海分公司技术部"));
$shanghai->Add(new MoneyDept("上海分公司财务部"));$root->Add($shanghai);$root->Display(1);echo "<hr/>";$root->Remove($shanghai);
$root->Display(3);

优势:

组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。

欢迎关注我的视频课程,地址如下,谢谢。

PHP面向对象设计模式

PHP设计模式——组合器模式相关推荐

  1. Go 设计模式 - 装饰器模式

    装饰模式使用对象组合的方式动态改变或增加对象行为.Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式.使用匿名组合,在装饰器中不必显式定义转调原对象方法. 设计模式 装饰器模式 装饰器模式主要 ...

  2. Java设计模式 -10- 装饰器模式(Decorator模式)

    Java设计模式 -10- 装饰器模式(Decorator模式) 前言 装饰器模式的定义与特点 优点: 缺点: 装饰器模式的结构与实现 1. 模式的结构 2. 模式的实现 装饰器模式的应用实例 装饰器 ...

  3. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  4. Spring设计模式(装饰器模式)

    Spring设计模式(装饰器模式) 模式的定义: 装饰者模式定义: ​ 动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案. 模式的结构图 : 模式包含角 ...

  5. PHP设计模式——装饰器模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 装饰器模式又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装 ...

  6. 设计模式---装饰器模式(C++实现)

    装饰器模式(Decorator Pattern)允许向一个现有对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原 ...

  7. C++设计模式 装饰器模式

    文章目录 1. 先验知识 2. 装饰器模式相关概念 3. 装饰器模式的应用 3.1 应用1: 给形状添加新的特征 不同形状加红 3.2 应用2: 给一个人穿不同的衣服 a 直接person类, 增加穿 ...

  8. JS设计模式——装饰器模式

    什么是装饰器模式? 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 实例 拿最近比 ...

  9. Java设计模式-装饰器模式 理论代码相结合

    继Java设计模式适配器模式后的装饰器模式来啦,让我们一起看看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一 ...

最新文章

  1. 【鸿蒙 HarmonyOS】HarmonyOS 开发环境搭建 ( Node.js 安装 )
  2. matlab中if语句多个_科学计算 | MATLAB程序设计基础
  3. 关于调试过程中单片机复位的几点心得与体会
  4. 查看linux系统属性
  5. 修改对象的某个属性的值_什么是类,什么是对象
  6. 【codevs2488】绿豆蛙的归宿
  7. 物联网落地三大困境破解
  8. 为什么同现矩阵*评分矩阵=推荐结果?
  9. Javascript综合应用小案例
  10. Entity Framework安装方法
  11. [转载] 杜拉拉升职记——34 设定工作目标要符合“SMART”原则
  12. jdk线程的同步问题
  13. 程序员想创业首先要突破自己三关(转)
  14. Redraiment猜想----米勒拉宾+分块打表
  15. 计算机编程 常用术语英语词汇大全 记忆
  16. Oracle 客户端下载
  17. mysql binlog常用操作
  18. 郭天祥的10天学会51单片机_第二节
  19. java吸_结对编程(java)
  20. 中国成网络攻击最大受害国之一

热门文章

  1. android studio 便携式wlan热点 网络名称_手机移动网络共享,还可以这么玩,你知道吗?...
  2. java集群解析文件_java相关:springboot整合redis集群过程解析
  3. parted如何将磁盘所有空间格式化_linux文件系统及磁盘格式化
  4. python信号处理的优点_python 信号处理
  5. python筛选质数并一行输出五个_python使用filter方法递归筛选法求N以内的质数素数附一行打印心形标记的代码解析...
  6. myelicpse无法连接mysql_myeclipse连接不到mysql
  7. hibernate框架 最新_Java 15 个框架
  8. 北京理工大学计算机学院杨晨,杨旭_北京理工大学计算机学院
  9. 社区发现(一)--算法综述
  10. 为什么新装的mysql5.7服务无法启动_mysql 5.7安装 MySQL 服务无法启动但是服务没有报告任何错误...