Composite Pattern,管理有層次的物件們
Composite Pattern,管理有層次的物件們

Composite Pattern,管理有層次的物件們

Tags
Golang
Hey! Go Design Patterns
ithome 2021 ironman
Date
Sep 24, 2021

什麼是 Composite Pattern?

將單一與多個物件的使用方式統一給使用者使用
UML 圖如下:
notion image

問題情境

假設 PS5 設計的測試階段,會以單核心多核心的 cpu 來測試,單核心 cpu 測試使用的指令需與多核心 cpu 使用的指令相同,這樣 PS5 單核與多核才都可以拿來測試

解決方式

UML 圖如下:
notion image
我們先定義了CPUinterface,單核心 cpuSingleCPU{}與多核心 cpuMultiCPUs{}都以此 interface 來實作,PS5Start()相依CPUinterface,SingleCPU{}MultiCPUs{}都可以帶入來運行.Run()
MultiCPUs{}.AddSubCPU()可以新增多個 cpu 至此 struct,而MultiCPUs{}.Run()會將多個 cpu 依依運行。
(相關的 code 在Github - go-design-patterns)
code 如下:
package main import "fmt" type CPU interface { Run() } type SingleCPU struct{} func (SingleCPU) Run() { fmt.Println("run cpu") } type MultiCPUs struct { SubCPUs []CPU } func (d MultiCPUs) Run() { for _, cpu := range d.SubCPUs { cpu.Run() } } func (m *MultiCPUs) AddSubCPU(cpu CPU) { m.SubCPUs = append(m.SubCPUs, cpu) } func PS5Start(cpu CPU) { cpu.Run() } func main() { singleCPU1 := SingleCPU{} PS5Start(singleCPU1) singleCPU2 := SingleCPU{} PS5Start(singleCPU2) multiCPUs := MultiCPUs{} multiCPUs.AddSubCPU(&singleCPU1) multiCPUs.AddSubCPU(&singleCPU2) PS5Start(multiCPUs) }