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

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

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

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

定义

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

场景

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

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

下面模拟出以下的目录树

  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树形结构

分享到: