2023-08-25|閱讀時間 ‧ 約 4 分鐘

Golang - Design Pattern #11: 組合模式 ( Composite)

raw-image
🌳樹狀結構的處理🌳

你有沒有試著畫出家族樹或公司組織架構圖呢?如果有,那你其實已經初步了解「組合模式 (Composite Pattern)」了!這種模式就是用來處理這類包含部分和整體的樹狀結構。這篇文章,我們就來深入探討它是如何運作的。


開始的時候…

組合模式允許你把單一物件和物件組合成樹形結構,這樣可以把它們當成同樣的方式來處理。在此模式下,通常有兩種物件:節點和葉子。節點是有子節點的,而葉子則沒有。


Go 實踐


🛠 組織架構的例子

想像你正在為一家大型公司設計一個組織架構管理系統。在這家公司裡,每個人都是一個“葉子”,而各種部門或團隊則是“節點”。


package main

// 葉子:員工
type Employee struct {
Name string
}

// 節點:部門
type Department struct {
Employees []interface{}
}

func (d *Department) Add(e interface{}) {
d.Employees = append(d.Employees, e)
}

func main() {
// 建立新員工
alice := &Employee{"Alice"}
bob := &Employee{"Bob"}

// 建立新部門
hr := &Department{}
hr.Add(alice)
hr.Add(bob)

// 現在 HR 部門內有 Alice 和 Bob!
}


🌱 文件系統

考慮一下你的電腦文件系統。文件夾可以包含文件,或者更多的文件夾。這種結構很適合用組合模式來表示。

package main

type File struct {
Name string
Size int
}

type Folder struct {
Name string
Children []interface{}
}

func (f *Folder) Add(child interface{}) {
f.Children = append(f.Children, child)
}

func (f *Folder) Count() int {
return len(f.Children)
}

func main() {
myFile := &File{"myDocument.txt", 5}
myFolder := &Folder{"MyDocuments", []interface{}{}}
myFolder.Add(myFile) // 現在 MyDocuments 文件夾包含一個文件!
}


為什麼要這樣做?

  1. 統一的處理方式:不論是單一物件還是物件的組合,你都可以用一致的方式來處理。
  2. 靈活性:允許你隨時新增新部門或移動員工,而不需要大規模地改變現有結構。


小結

組合模式是一個超實用的模式,特別是當你需要管理樹狀結構時。下次當你看到家族樹、組織圖或任何其他層次結構時,你就知道背後可能就運作著組合模式啦!🚀

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.