实现树状结构_php设计模式之组合模式——处理树形结构数据

0e9f444235616c99912f4300ffcf8ed4.png

php中文网最新课程

每日17点准时技术干货分享

212a4f69118ae0889f96508823b67b21.png

223e5919734af70c470cea4c827ecca9.gif

本文为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

总结

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

32e77d70f16b9826ad739010f6786b3d.png

b89ffdefd077cb42caed5f97461467f9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值