定义
组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。它的核心就在于递归,通过递归来依次处理树形结构数据。
场景
文件目录树就是一个典型的树形结构的数据。下面展示一个用于计算文件或目录大小的功能的类,主要有两个方法,添加子节点(子树)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设计模式之组合模式——处理树形结构数据的知识。速戳>>知识兔学习精品课!