zoukankan      html  css  js  c++  java
  • 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

    总结

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

  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/clubs/p/13463227.html
Copyright © 2011-2022 走看看