Strategy Pattern,選定不同的策略來執行

什麼是 Strategy Pattern?

設計相同介面但不同實作的物件,再由使用端以此介面去選擇要使用何種物件

UML 圖如下:

https://i.imgur.com/wdpjmgf.png

問題情境

假設 PS5 會使用不同廠商的顯示晶片,需要有一個方法讓遊戲以不同的顯示晶片運行。

解決方式

PS5{}.gpu依賴GPUinterface,A 廠商的AGPU{}與 B 廠商的BGPU{}都是以此GPUinterface 實作,我們在CreatePS5()的時候選定要使用哪個廠商的 GPU,由使用端去選擇要使用何種策略來創造 PS5,選擇完策略後,就可以使用此策略物件來玩遊戲PS5{}.PlayGame()

UML 圖如下:

https://i.imgur.com/GORPVOw.png

code 如下:

(相關的 code 在Github - go-design-patterns)

package main

import "fmt"

type GPU interface {
	Draw()
}

type AGPU struct{}

func (a AGPU) Draw() {
	fmt.Println("draw!")
}

type BGPU struct{}

func (b BGPU) Draw() {
	fmt.Println("draw!")
}

type CGPU struct{}

func (b CGPU) Draw() {
	fmt.Println("draw!")
}

type PS5 struct {
	gpu GPU
}

func CreatePS5(gpu GPU) PS5 {
	ps5 := PS5{
		gpu: gpu,
	}
	return ps5
}

func (p PS5) PlayGame() {
	p.gpu.Draw()
	fmt.Println("play game!")
}

func main() {
	gpu := AGPU{} // BGPU{} or CGPU{}
	ps5 := CreatePS5(&gpu)
	ps5.PlayGame()
}
comments powered by Disqus