Golang - Design Pattern #3: 策略模式 (Strategy)

閱讀時間約 4 分鐘

當面臨多種算法或策略的選擇,策略模式可以作為一個非常有效的解決方案。它允許我們在運行時選擇不同的策略,從而使程式碼更加靈活和可擴展。

簡介

策略模式定義了一系列的算法,將它們封裝起來,並且使它們可以互相替換。該模式讓算法的變化獨立於使用算法的客戶端。

主要有以下優勢:

  1. 分離算法:通過定義算法家族,策略模式可以將算法的定義和使用分離開來。
  2. 提高可擴展性:新的策略可以容易地新增到策略家族中。
  3. 避免多重條件選擇:使用策略模式可以避免使用多個if...elseswitch語句。

實務案例

運送策略

假設我們正在開發一個電商平台,需要根據用戶的不同選擇來計算運費。我們可以使用策略模式來實現這個功能。

首先,定義一個策略 Interface

type ShippingStrategy interface {
CalculateCost(order Order) float64
}

接著,我們可以為每種運送方式定義一個策略:

type UPS struct{}

func (u *UPS) CalculateCost(order Order) float64 {
// 假設 UPS 的運費計算...
return 10.0
}

type FedEx struct{}

func (f *FedEx) CalculateCost(order Order) float64 {
// 假設 FedEx 的運費計算...
return 12.0
}

付款策略

假設你的平台上提供多種付款方式,例如信用卡、PayPal和比特幣。每一種付款方式都有自己的交易手續費策略。使用策略模式,我們可以方便地為每種付款方式實現不同的計費策略。

首先,我們定義策略接口:

type PaymentStrategy interface {
TransactionFee(amount float64) float64
}

然後,為每種付款方式實現該策略:

type CreditCard struct{}

func (c *CreditCard) TransactionFee(amount float64) float64 {
return 0.03 * amount // 假設 3% 的手續費
}

type PayPal struct{}

func (p *PayPal) TransactionFee(amount float64) float64 {
return 0.04 * amount // 假設 4% 的手續費
}

type Bitcoin struct{}

func (b *Bitcoin) TransactionFee(amount float64) float64 {
return 0.01 * amount // 假設 1% 的手續費
}


使用 map 選擇策略

還記得前一篇的 Golang - Design Pattern #2: 工廠模式 (Factory)

我們可以用一個map來存儲所有策略

strategies := map[string]interface{}{
"UPS": &UPS{},
"FedEx": &FedEx{},
"CreditCard": &CreditCard{},
"PayPal": &PayPal{},
"Bitcoin": &Bitcoin{},
}

// 假設從用戶輸入或其他方式獲得
userChoice := "CreditCard"
strategy := strategies[userChoice]

這種方法使得新增新策略變得非常容易,只需擴展 strategies 這個 map 即可。


結語

策略模式不僅可以使你的代碼更加組織化和靈活,還可以通過使用像 map 這樣的結構來簡化策略的選擇過程。這樣的設計方式特別適合於需要支援多種策略,且頻繁更換策略的情境,例如付款方法或運輸方法等。希望這些增加的實務案例和解釋能夠滿足你的需求!🚀

30會員
193內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
avatar
邱品齊皮膚科醫師
2023-04-27
Golang 的資料型別一覽👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
avatar
wang alan
2023-08-17
韓國SONO CALM GOYANG HOTEL跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
avatar
lunar
2023-07-13
Design | JPEG、PNG、PDF 差異與介紹這篇文章將會講述常用圖檔的檔案格式差異、比較和應用。
Thumbnail
avatar
瓶裝雪
2022-11-16
Designer | 個人專案(Side Project)Side Project 是打破傳說魔咒的解咒法,對於新鮮人來說,要找工作大多都要求工作經驗,然而這就跟打副本需要至少兩次刷副本的經驗一樣,若在團隊中沒有熟人,永遠會卡在等級一。
Thumbnail
avatar
瓶裝雪
2022-07-13
Singleton design patternSingleton design pattern
Thumbnail
avatar
Vic Lin
2020-08-20
Web Design Hong Kong - MiracleWeb design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
avatar
Marlon Francis
2020-03-18
Design about food X 消化 Digest|篆刻創作特展 從服務生小姐到藝術家,從飲食色彩活動到個人篆刻特展,我很榮幸身邊有一位跟我一樣關注飲食與人,熱愛自我探索、享受實驗驗證過程的好朋友 -蔡大暇
Thumbnail
avatar
Amber 詹慧珍
2020-02-20
建立 Golang http web server建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
avatar
Vic Lin
2019-11-16
Golang 入門Golang 入門
Thumbnail
avatar
Vic Lin
2019-11-09
Golang RegExp Notes遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~
Thumbnail
avatar
Rain Wu
2019-03-17