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 這樣的結構來簡化策略的選擇過程。這樣的設計方式特別適合於需要支援多種策略,且頻繁更換策略的情境,例如付款方法或運輸方法等。希望這些增加的實務案例和解釋能夠滿足你的需求!🚀

avatar-img
31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
KH Huang的沙龍 的其他內容
工廠模式 (Factory) 在物件創建中佔有舉足輕重的位置,讓我們能以更模組化的方式管理物件的生成。這篇文章將帶領你深入工廠模式在Go語言中的實踐。
哈囉!繼續我們的Go設計模式之旅,今天我們要探討的是「單例模式」。可能你已經聽過它,也可能還沒。但不用擔心,我們會從基礎解釋開始!
大家好,歡迎來到「Golang - Design Pattern」系列文!你或許已經聽過「設計模式」這四個字,或者你可能還不太清楚它在軟體開發中的角色。不管你是哪一種情況,我們都會從頭開始,循序漸進地為你解鎖Go語言在設計模式中的神奇之處。 簡介 設計模式是什麼呢?簡單地說,它就是一套「最佳
工廠模式 (Factory) 在物件創建中佔有舉足輕重的位置,讓我們能以更模組化的方式管理物件的生成。這篇文章將帶領你深入工廠模式在Go語言中的實踐。
哈囉!繼續我們的Go設計模式之旅,今天我們要探討的是「單例模式」。可能你已經聽過它,也可能還沒。但不用擔心,我們會從基礎解釋開始!
大家好,歡迎來到「Golang - Design Pattern」系列文!你或許已經聽過「設計模式」這四個字,或者你可能還不太清楚它在軟體開發中的角色。不管你是哪一種情況,我們都會從頭開始,循序漸進地為你解鎖Go語言在設計模式中的神奇之處。 簡介 設計模式是什麼呢?簡單地說,它就是一套「最佳
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
這篇文章將會講述常用圖檔的檔案格式差異、比較和應用。
Thumbnail
Side Project 是打破傳說魔咒的解咒法,對於新鮮人來說,要找工作大多都要求工作經驗,然而這就跟打副本需要至少兩次刷副本的經驗一樣,若在團隊中沒有熟人,永遠會卡在等級一。
Web design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
Thumbnail
從服務生小姐到藝術家,從飲食色彩活動到個人篆刻特展,我很榮幸身邊有一位跟我一樣關注飲食與人,熱愛自我探索、享受實驗驗證過程的好朋友 -蔡大暇
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
這篇文章將會講述常用圖檔的檔案格式差異、比較和應用。
Thumbnail
Side Project 是打破傳說魔咒的解咒法,對於新鮮人來說,要找工作大多都要求工作經驗,然而這就跟打副本需要至少兩次刷副本的經驗一樣,若在團隊中沒有熟人,永遠會卡在等級一。
Web design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
Thumbnail
從服務生小姐到藝術家,從飲食色彩活動到個人篆刻特展,我很榮幸身邊有一位跟我一樣關注飲食與人,熱愛自我探索、享受實驗驗證過程的好朋友 -蔡大暇
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~