iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0
Software Development

Hey! Go Design Patterns系列 第 24

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

  • 分享至 

  • xImage
  •  

2023/04/05 更新: 為了避免本文章散落在不同網站,之後統一由部落格更新,再麻煩從部落格查看~

什麼是 Composite Pattern?

將單一與多個物件的使用方式統一給使用者使用

UML 圖如下:

問題情境

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

解決方式

UML 圖如下:

我們先定義了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)
}

上一篇
DAY 23:Facade Pattern,由統一的入口介面來做事
下一篇
DAY 25:Flyweight Pattern,節省空間的好幫手
系列文
Hey! Go Design Patterns30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言