Hi all 綜合到上一篇為止,我們在創建型的設計模型的實作學習就到這了。
在接下來的篇章中我們會開始著手在結構型的設計模型,說來說去那就從這一篇開始。
中文為組合模式 (Composite Pattern),是一種將一組物件當作單一物件使用的模式。組合模式讓開發者有個樹狀結構的物件關係,並可要求每個節點執行任意任務,其主要功能是在整個樹狀結構使用遞迴方法並將結果進行整合。
組合模式中的角色有
在此雛形我們將嘗試透過組合模型拉出個樹狀節點,如圖
package Components
type Component interface {
Excute()
Add(Component)
}
package Leaves
import (
components "composit-pattern/Components"
"fmt"
)
type Leaf struct {
value int
}
func NewLeaf(value int) *Leaf {
return &Leaf{value: value}
}
func (l *Leaf) Excute() {
fmt.Println(l.value)
}
func (l *Leaf) Add(c components.Component) {
}
package composites
import (
components "composit-pattern/Components"
)
type Composite struct {
children []components.Component
}
func NewComposite() *Composite {
// TODO: return a zero-length composite
return &Composite{make([]components.Component, 0)}
}
func (c *Composite) Add(component components.Component) {
c.children = append(c.children, component)
}
func (c *Composite) Excute() {
for i := 0; i < len(c.children); i++ {
c.children[i].Excute()
}
}
package main
import (
composites "composit-pattern/Composites"
leaves "composit-pattern/Leaves"
)
func main() {
composit := composites.NewComposite()
leaf1 := leaves.NewLeaf(1)
composit.Add(leaf1)
leaf2 := leaves.NewLeaf(2000)
composit.Add(leaf2)
composit2 := composites.NewComposite()
composit.Add(composit2)
leaf3 := leaves.NewLeaf(3)
composit2.Add(leaf3)
composit.Excute()
}
在程式方面,我們在NewComposite()中學到透過make 建立一個新陣列且給予其初始值。
此外也透過前篇文章中學到的**append()**為我們的陣列新增成員。
通過本篇的學習,我們可以理解到組合模式不僅可以簡化客戶端的程式碼,更可以使系統更加靈活和可擴展。它將「整體」和「部分」的操作統一,並可以輕鬆地添加或移除組件。 然而,正如我們所討論的,它也有其缺點,特別是在試圖限制組件類別時可能會遇到困難。但是,正確應用時,它可以大大提升系統的模塊化和可維護性。