iT邦幫忙

2021 iThome 鐵人賽

DAY 30
1
Software Development

Hey! Go Design Patterns系列 第 30

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

  • 分享至 

  • xImage
  •  

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

什麼是 Strategy Pattern?

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

UML 圖如下:

問題情境

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

解決方式

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

UML 圖如下:

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()
}

上一篇
DAY 29:Iterator Pattern,迭代各種不同的物件
系列文
Hey! Go Design Patterns30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

1
juck30808
iT邦研究生 1 級 ‧ 2021-10-14 11:52:44

恭喜完賽/images/emoticon/emoticon12.gif

感謝,design pattern還有一部份要寫,之後會繼續新增~

0
雷N
iT邦研究生 1 級 ‧ 2021-10-15 00:51:28

恭喜完賽! /images/emoticon/emoticon12.gif
併發模式寫的不錯 學到了感謝

感謝,大大的經驗談也非常棒,學習到很多~

我要留言

立即登入留言