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

閱讀時間約 3 分鐘
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. 靈活性:允許你隨時新增新部門或移動員工,而不需要大規模地改變現有結構。


小結

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

avatar-img
31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
KH Huang的沙龍 的其他內容
嗨,各位!想像一下你住在一棟大樓里,每次有人要進來時,他們得先經過樓下的門禁員檢查,這樣才能確保大樓的安全。在程式設計的世界裡,我們也有類似的機制,那就是「代理模式 (Proxy Pattern)」!
嗨,各位!大家有沒有買過新的手機或筆電,然後發現充電線插頭跟你家的插座不匹配?這時候你會怎麼辦?找個轉接頭來用對吧!今天我們就來聊聊在程式設計中的「轉接頭」── 適配器模式(Adapter Pattern)!
大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
你還記得小時候玩的樂高嗎?一塊一塊的組裝起來,每塊都增加了更多的功能。裝飾者模式也是這樣,給你一種疊加功能的感覺,但卻不會搞亂原有的設計。
你有沒有用過智能家居遙控器,按一下開燈、再按一下關電視?那麼,你可能已經用過命令模式了!
嗨,各位!想像一下你住在一棟大樓里,每次有人要進來時,他們得先經過樓下的門禁員檢查,這樣才能確保大樓的安全。在程式設計的世界裡,我們也有類似的機制,那就是「代理模式 (Proxy Pattern)」!
嗨,各位!大家有沒有買過新的手機或筆電,然後發現充電線插頭跟你家的插座不匹配?這時候你會怎麼辦?找個轉接頭來用對吧!今天我們就來聊聊在程式設計中的「轉接頭」── 適配器模式(Adapter Pattern)!
大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
你還記得小時候玩的樂高嗎?一塊一塊的組裝起來,每塊都增加了更多的功能。裝飾者模式也是這樣,給你一種疊加功能的感覺,但卻不會搞亂原有的設計。
你有沒有用過智能家居遙控器,按一下開燈、再按一下關電視?那麼,你可能已經用過命令模式了!
你可能也想看
Google News 追蹤
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
組織架構的整合與建立是一個變化與多層面的過程,結合觀點戰略規劃、資源分配和持續改進。以下是一些關鍵步驟和方法。首先需要明確組織的使命、願景和戰略目標。對現有的組織架構進行全面分析,瞭解其優勢和不足之處。識別組織運營中最關鍵的職能和流程,確保這些核心要素在新的架構中得到充分支持和優化。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
Thumbnail
子集合生成是一道經典的組合類上機考和面試題目。本篇文章介紹多個不同的解決方案,以及相關演算法框架。主要目標是給定n個相異的元素,產生所有的子集合。
Thumbnail
這篇文章,會帶著大家複習以前學過的配對模型與Stack框架, 並且以括弧配對的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 首先,Stack本身具有Last-In First-Out 後進先出的特質。 再根據題目所需要的資訊利用Stack去儲存索引
Thumbnail
草臺班子理論是指人類世界就像是一個臨時拼湊起來的團體,處處充滿混亂、敷衍,各種組織表面光鮮亮麗,實則各有問題。那不會的工作就是不會呀,那怎麼辦呢?我並沒有要你憑空學會,你也不需要,而是要你...
上一篇文章提到有些介面不應被繼承,但物件導向的子類別只能繼承父類別的介面,因而產生一些不合適的介面實作。trait/typeclass則沒有這種繼承機制,這似乎使需要繼承的特性無法直接使用。然而函數式導向比起繼承,更適合使用組合,根本不需要使用繼承疊加特性。 資料類型的定義往往跟怎麼建構模型相
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
組織架構的整合與建立是一個變化與多層面的過程,結合觀點戰略規劃、資源分配和持續改進。以下是一些關鍵步驟和方法。首先需要明確組織的使命、願景和戰略目標。對現有的組織架構進行全面分析,瞭解其優勢和不足之處。識別組織運營中最關鍵的職能和流程,確保這些核心要素在新的架構中得到充分支持和優化。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
Thumbnail
子集合生成是一道經典的組合類上機考和面試題目。本篇文章介紹多個不同的解決方案,以及相關演算法框架。主要目標是給定n個相異的元素,產生所有的子集合。
Thumbnail
這篇文章,會帶著大家複習以前學過的配對模型與Stack框架, 並且以括弧配對的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 首先,Stack本身具有Last-In First-Out 後進先出的特質。 再根據題目所需要的資訊利用Stack去儲存索引
Thumbnail
草臺班子理論是指人類世界就像是一個臨時拼湊起來的團體,處處充滿混亂、敷衍,各種組織表面光鮮亮麗,實則各有問題。那不會的工作就是不會呀,那怎麼辦呢?我並沒有要你憑空學會,你也不需要,而是要你...
上一篇文章提到有些介面不應被繼承,但物件導向的子類別只能繼承父類別的介面,因而產生一些不合適的介面實作。trait/typeclass則沒有這種繼承機制,這似乎使需要繼承的特性無法直接使用。然而函數式導向比起繼承,更適合使用組合,根本不需要使用繼承疊加特性。 資料類型的定義往往跟怎麼建構模型相