php 处理树形数据,php设计模式之组合模式——处理树形结构数据
关于组合模式,千万不要从字面理解,它和我们理解的组合关系没什么关系,它是用来处理树状结构的数据。因为它只能处理树形结构的数据,所以在日常中并不是很常用,但如果满足了树形结构,使用该模式就能非常好的处理,能够大大减少代码量,写出的代码简洁明了。
定义
组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。它的核心就在于递归,通过递归来依次处理树形结构数据。
场景
文件目录树就是一个典型的树形结构的数据。下面展示一个用于计算文件或目录大小的功能的类,主要有两个方法,添加子节点(子树)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设计模式之组合模式——处理树形结构数据相关推荐
- java设计模式之组合模式(树形层级)
java设计模式之组合模式 学习难度:★★★☆☆,使用频率:★★★★☆] 树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来 ...
- java设计模式用组合模式实现树形结构
现有如下需求,某公司的机构: +公司 +分公司 +本地分公司 -呼和浩特 +包头 -昆区办事处 -青山办事处 +外地分公司 +总部 -人事处 +办公室 +财务处 实现思路: 抽象组合类,叶子类,根类 ...
- 【设计模式】组合模式?建议改名叫树形模式!
什么是组合模式(Composite) 概念 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及 ...
- 每天一个设计模式之组合模式
作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...
- 1、【设计模式】组合模式
java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆] 树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...
- python文件合法模式组合_python设计模式之组合模式
最开始接触组合设计模式是在大话设计模式这本书中的案例,讲的是让你设计一个公司的组织架构,一个总公司下有人力资源部门,IT部门, 财务部门,还有广州分公司.深圳分公司,在分公司下也有IT部门和财务部门, ...
- 23种设计模式之组合模式
组合模式的定义 定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通俗的说, 就是实现了树形结构 通用类图如下: 其中 ...
- python 设计模式之组合模式Composite Pattern
#引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...
- 详解设计模式:组合模式
组合模式(Composite Pattern),又叫部分整体模式,是 GoF 的 23 种设计模式中的一种结构型设计模式. 组合模式 是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组 ...
- (设计模式十一)java设计模式之组合模式
定义: 组合模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构.这种模式创建了一个包含 ...
最新文章
- Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法
- 前端笔试题面试题记录(上)
- MATLAB对字符串进行分割
- hihocoder Tower Defense Game(树上贪心)
- 分布式缓存Redis介绍
- http get post java_java发送http的get、post请求实现代码
- exec go 重启_如何用 Go 实现热重启
- MAC安装influxdb和grafana
- PostgreSQL 9.5 pg_dump新特性 你是我的眼
- Python——用assert语句来确保参数符合当前程序的要求
- Sophos 和 ReversingLabs 公开含2000万个 PE 文件的数据集
- Android基础入门教程——4.5.1 Intent的基本使用
- 光伏并网逆变器意大利CEI 0-21标准
- 基于MATLAB 的X-CT图像重建计算机仿真实验研究实验
- mac虚拟摄像头插件_macOS平台下虚拟摄像头的研发总结
- java 读取url获取的xml
- DELL服务器 R740的风扇设置
- 我是歌手黄绮珊(黄妈)彭佳慧,_bin910729_新浪博客
- DSSD: Deconvolutional Single Shot Detector
- 【开发环境】Windows环境下Python开发环境 Pycharm Anaconda安装配置(无错完整)
热门文章
- mpchart点击_MPAndroidChart 中BarChart使用遇到问题,求大神们指教。
- 服务器共享文件夹给广域网,广域网文件共享服务器
- java读写excel,解决poi包中没有org.apache.poi.ss.usermodel.CellType的问题
- 每日工作记录——状态机的编码选择
- 郭盛华是如何登上神坛?令全世界认识了中国的黑科技
- python 随机生成6位数字+字母的密码
- 时间序列分析 | 相似性度量基本方法
- AcWing Django框架课第一节笔记
- 怎么屏蔽计算机集成声卡,win10系统主板集成声卡关闭的设置方案
- java获取pdf文字坐标_Java 获取PDF关键字坐标