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
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
傳統的定價模式常常讓買賣雙方陷入一種敵對的局面,雙方都難以從中獲得完全的滿足。近年來,一種名為「隨意付費」(Pay What You Want)的創新定價策略逐漸引起了學術界和業界的關注。這種策略不僅挑戰了我們對價格的傳統認知,還為企業和消費者之間的關係帶來了新的可能性。在Jagmohan Raju
※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
Thumbnail
接續上一講,繼續來講框架。 要知道起手式不僅不能為策略定調,即使是同樣的框架,也可能是完全不同的策略...
Thumbnail
接下來的講座將帶給同學們一個全新的策略設計觀點,一般選擇權教學絕對教不來的知識,這也是有驚無險流的策略之所以比別家的策略有效的重要原因。 篇幅較長,所以會拆成兩篇。
Thumbnail
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
Thumbnail
一個好的策略不一定得很複雜,但必須得是有計畫的行事。 對於有驚無險流來說,完整的【策略】在流程上應該包含了策略三部曲。
Thumbnail
下寬和在《無痛買單》一書中,詳細的說明了24種不同的定價策略,其中心理效果型定價策略包含了價格線定價(松竹梅原則:將產品規劃成低中高等三價位)與錨定效應、縮水式通膨,以及畸零定價等四種策略,今天將針對後續三種心理效果型定價方式加以說明,並藉由生活中的例子來說明這些策略的運用和效果。 首先是錨定效應
Thumbnail
在《無痛買單》一書中,作者下寬和(Shimokawa Hiroshi)將定價細分成24種方式。其中「加成定價」、「現行價格」和「價格領導跟隨法」,他歸類為反應型方法,原因是這些方法都為沿用現有價格,或是根據競爭對手的價格進行調整。下寬和非常不推薦這三個方法,因為沒有考慮到可達預期銷售額與利潤,不過這
進行了策略擴充,添加了「強多頭」以及「空方」兩種情況。期望除了原先的右側轉折作多策略外,將運用情境擴充,增加整體勝率與報酬率。
Thumbnail
邏輯運算子 它們在許多情境下都是程式語言中重要的工具,用於進行條件判斷和控制流程 在日常中總會遇到有些需要思考判斷的問題,比如要買東西,就會考慮到CP值,東西要好且要便宜,就是and的概念,如果在一些比較複雜的狀況,例如想晚餐吃什麼,就會想火鍋或燒烤都行,這就是or的概念。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
傳統的定價模式常常讓買賣雙方陷入一種敵對的局面,雙方都難以從中獲得完全的滿足。近年來,一種名為「隨意付費」(Pay What You Want)的創新定價策略逐漸引起了學術界和業界的關注。這種策略不僅挑戰了我們對價格的傳統認知,還為企業和消費者之間的關係帶來了新的可能性。在Jagmohan Raju
※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
Thumbnail
接續上一講,繼續來講框架。 要知道起手式不僅不能為策略定調,即使是同樣的框架,也可能是完全不同的策略...
Thumbnail
接下來的講座將帶給同學們一個全新的策略設計觀點,一般選擇權教學絕對教不來的知識,這也是有驚無險流的策略之所以比別家的策略有效的重要原因。 篇幅較長,所以會拆成兩篇。
Thumbnail
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
Thumbnail
一個好的策略不一定得很複雜,但必須得是有計畫的行事。 對於有驚無險流來說,完整的【策略】在流程上應該包含了策略三部曲。
Thumbnail
下寬和在《無痛買單》一書中,詳細的說明了24種不同的定價策略,其中心理效果型定價策略包含了價格線定價(松竹梅原則:將產品規劃成低中高等三價位)與錨定效應、縮水式通膨,以及畸零定價等四種策略,今天將針對後續三種心理效果型定價方式加以說明,並藉由生活中的例子來說明這些策略的運用和效果。 首先是錨定效應
Thumbnail
在《無痛買單》一書中,作者下寬和(Shimokawa Hiroshi)將定價細分成24種方式。其中「加成定價」、「現行價格」和「價格領導跟隨法」,他歸類為反應型方法,原因是這些方法都為沿用現有價格,或是根據競爭對手的價格進行調整。下寬和非常不推薦這三個方法,因為沒有考慮到可達預期銷售額與利潤,不過這
進行了策略擴充,添加了「強多頭」以及「空方」兩種情況。期望除了原先的右側轉折作多策略外,將運用情境擴充,增加整體勝率與報酬率。
Thumbnail
邏輯運算子 它們在許多情境下都是程式語言中重要的工具,用於進行條件判斷和控制流程 在日常中總會遇到有些需要思考判斷的問題,比如要買東西,就會考慮到CP值,東西要好且要便宜,就是and的概念,如果在一些比較複雜的狀況,例如想晚餐吃什麼,就會想火鍋或燒烤都行,這就是or的概念。