关于组合模式,千万不要从字面理解,它和我们理解的组合关系没什么关系,它是用来处理树状结构的数据。因为它只能处理树形结构的数据,所以在日常中并不是很常用,但如果满足了树形结构,使用该模式就能非常好的处理,能够大大减少代码量,写出的代码简洁明了。

定义

组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。它的核心就在于递归,通过递归来依次处理树形结构数据。

场景

文件目录树就是一个典型的树形结构的数据。下面展示一个用于计算文件或目录大小的功能的类,主要有两个方法,添加子节点(子树)addNode,统计文件或目录大小fileSize。class File

{

private $path = '';

private $nodes = [];

private $fileSize = 0;

public function __construct(string $path, int $fileSize)

{

$this->path = $path;

$this->fileSize = $fileSize;

}

public function addNode (File $node)

{

$this->nodes[] = $node;

}

public function fileSize ()

{

$size = 0;

foreach ($this->nodes as $node) {

$size += $node->fileSize();

}

return $size;

}

}

下面模拟出以下的目录树/app

/app/1.txt

/app/a

/app/b

/app/a/a1.txt

/app/b/b1.txt

/app/b/b2.txt

测试代码如下:$node0 = new File('/app', 0);

$node1 = new File('/app/1.txt', 1000);

$node2 = new File('/app/a', 0);

$node3 = new File('/app/b', 0);

$node21 = new File('/app/a1.txt', 1000);

$node31 = new File('/app/b1.txt', 1000);

$node32 = new File('/app/b2.txt', 1000);

$node2->addNode($node21);

$node3->addNode($node31);

$node3->addNode($node32);

$node0->addNode($node1);

$node0->addNode($node2);

$node0->addNode($node3);

// 计算目录/app/b大小

echo $node3->fileSize() . 'B' . PHP_EOL; // 2000

// 计算/app目录大小

echo $node0->fileSize() . 'B' . PHP_EOL; // 4000

总结

组合模式,将一组对象组织成树形的结构,然后将对象看做是树的节点。利用树形的数据结构,使用递归来处理每个子树,依次来简化代码实现。因为该模式对于数据有严格的要求,所以在日常中用到的并不多。如想使用该模式,需要你对业务场景非常的了解,然后能把数据抽象成树形结构。一般我们常见的有,文件的目录树、无限极分类的处理等等。

php 处理树形数据,php设计模式之组合模式——处理树形结构数据相关推荐

  1. java设计模式之组合模式(树形层级)

    java设计模式之组合模式 学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来 ...

  2. java设计模式用组合模式实现树形结构

    现有如下需求,某公司的机构: +公司 +分公司 +本地分公司 -呼和浩特 +包头 -昆区办事处 -青山办事处 +外地分公司 +总部 -人事处 +办公室 +财务处 实现思路: 抽象组合类,叶子类,根类 ...

  3. 【设计模式】组合模式?建议改名叫树形模式!

    什么是组合模式(Composite) 概念 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及 ...

  4. 每天一个设计模式之组合模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  5. 1、【设计模式】组合模式

    java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...

  6. python文件合法模式组合_python设计模式之组合模式

    最开始接触组合设计模式是在大话设计模式这本书中的案例,讲的是让你设计一个公司的组织架构,一个总公司下有人力资源部门,IT部门, 财务部门,还有广州分公司.深圳分公司,在分公司下也有IT部门和财务部门, ...

  7. 23种设计模式之组合模式

    组合模式的定义 定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通俗的说, 就是实现了树形结构 通用类图如下: 其中 ...

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

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

  9. 详解设计模式:组合模式

    组合模式(Composite Pattern),又叫部分整体模式,是 GoF 的 23 种设计模式中的一种结构型设计模式. 组合模式 是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组 ...

  10. (设计模式十一)java设计模式之组合模式

    定义: 组合模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构.这种模式创建了一个包含 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法
  2. 前端笔试题面试题记录(上)
  3. MATLAB对字符串进行分割
  4. hihocoder Tower Defense Game(树上贪心)
  5. 分布式缓存Redis介绍
  6. http get post java_java发送http的get、post请求实现代码
  7. exec go 重启_如何用 Go 实现热重启
  8. MAC安装influxdb和grafana
  9. PostgreSQL 9.5 pg_dump新特性 你是我的眼
  10. Python——用assert语句来确保参数符合当前程序的要求
  11. Sophos 和 ReversingLabs 公开含2000万个 PE 文件的数据集
  12. Android基础入门教程——4.5.1 Intent的基本使用
  13. 光伏并网逆变器意大利CEI 0-21标准
  14. 基于MATLAB 的X-CT图像重建计算机仿真实验研究实验
  15. mac虚拟摄像头插件_macOS平台下虚拟摄像头的研发总结
  16. java 读取url获取的xml
  17. DELL服务器 R740的风扇设置
  18. 我是歌手黄绮珊(黄妈)彭佳慧,_bin910729_新浪博客
  19. DSSD: Deconvolutional Single Shot Detector
  20. 【开发环境】Windows环境下Python开发环境 Pycharm Anaconda安装配置(无错完整)

热门文章

  1. mpchart点击_MPAndroidChart 中BarChart使用遇到问题,求大神们指教。
  2. 服务器共享文件夹给广域网,广域网文件共享服务器
  3. java读写excel,解决poi包中没有org.apache.poi.ss.usermodel.CellType的问题
  4. 每日工作记录——状态机的编码选择
  5. 郭盛华是如何登上神坛?令全世界认识了中国的黑科技
  6. python 随机生成6位数字+字母的密码
  7. 时间序列分析 | 相似性度量基本方法
  8. AcWing Django框架课第一节笔记
  9. 怎么屏蔽计算机集成声卡,win10系统主板集成声卡关闭的设置方案
  10. java获取pdf文字坐标_Java 获取PDF关键字坐标