当前位置:首页 > PHP教程 > php高级应用 > 列表

php设计模式之组合模式——处理树形结构数据

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-21 20:50:45 浏览: 评论:0 

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

定义

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

场景

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

  1. class File 
  2.  
  3.  
  4.     private $path = ''
  5.  
  6.     private $nodes = []; 
  7.  
  8.     private $fileSize = 0; 
  9.  
  10.       
  11.  
  12.     public function __construct(string $path, int $fileSize
  13.  
  14.     { 
  15.  
  16.         $this->path = $path
  17.  
  18.         $this->fileSize = $fileSize
  19.  
  20.     } 
  21.  
  22.       
  23.  
  24.     public function addNode (File $node
  25.  
  26.     { 
  27.  
  28.         $this->nodes[] = $node
  29.  
  30.     } 
  31.  
  32.       
  33.  
  34.     public function fileSize () 
  35.  
  36.     { 
  37.  
  38.         $size = 0; 
  39.  
  40.         foreach ($this->nodes as $node) { 
  41.  
  42.             $size += $node->fileSize(); 
  43.  
  44.         } 
  45.  
  46.         return $size
  47.  
  48.     } 
  49.  

下面模拟出以下的目录树

  1. /app 
  2.   
  3. /app/1.txt 
  4.  
  5. /app/a 
  6.  
  7. /app/b 
  8.   
  9. /app/a/a1.txt 
  10.  
  11. /app/b/b1.txt 
  12.  
  13. /app/b/b2.txt 

测试代码如下:

  1. $node0 = new File('/app', 0); 
  2.  
  3. $node1 = new File('/app/1.txt', 1000); 
  4.  
  5. $node2 = new File('/app/a', 0); 
  6.  
  7. $node3 = new File('/app/b', 0); 
  8.  
  9. $node21 = new File('/app/a1.txt', 1000); 
  10.  
  11. $node31 = new File('/app/b1.txt', 1000); 
  12.  
  13. $node32 = new File('/app/b2.txt', 1000); 
  14.  
  15. $node2->addNode($node21); 
  16.  
  17. $node3->addNode($node31); 
  18.  
  19. $node3->addNode($node32); 
  20.  
  21. $node0->addNode($node1); 
  22.  
  23. $node0->addNode($node2); 
  24.  
  25. $node0->addNode($node3); 
  26.  
  27. // 计算目录/app/b大小 
  28.  
  29. echo $node3->fileSize() . 'B' . PHP_EOL; // 2000 
  30.  
  31. // 计算/app目录大小 
  32.  
  33. echo $node0->fileSize() . 'B' . PHP_EOL; // 4000 

总结

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

Tags: php组合模式 php树形结构

分享到: