首頁  >  文章  >  後端開發  >  php設計模式之組合模式-處理樹狀結構數據

php設計模式之組合模式-處理樹狀結構數據

齐天大圣
齐天大圣原創
2020-08-05 16:39:491683瀏覽

關於組合模式,千萬不要從字面理解,它和我們理解的組合關係沒什麼關係,它是用來處理樹狀結構的資料。因為它只能處理樹狀結構的數據,所以在日常中並不是很常用,但如果滿足了樹形結構,使用該模式就能非常好的處理,能夠大大減少代碼量,寫出的代碼簡潔明了。

定義

組合模式是一種結構型設計模式, 你可以使用它將物件組合成樹狀結構, 並且能像使用獨立物件一樣使用它們。它的核心就在於遞歸,透過遞歸來依序處理樹狀結構資料。

場景

檔案目錄樹就是一個典型的樹狀結構的資料。下面展示一個用於計算檔案或目錄大小的功能的類,主要有兩個方法,增加子節點(子樹)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設計模式之組合模式-處理樹狀結構數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn