當面臨多種算法或策略的選擇,策略模式可以作為一個非常有效的解決方案。它允許我們在運行時選擇不同的策略,從而使程式碼更加靈活和可擴展。
策略模式定義了一系列的算法,將它們封裝起來,並且使它們可以互相替換。該模式讓算法的變化獨立於使用算法的客戶端。
主要有以下優勢:
if...else
或switch
語句。假設我們正在開發一個電商平台,需要根據用戶的不同選擇來計算運費。我們可以使用策略模式來實現這個功能。
首先,定義一個策略 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
這樣的結構來簡化策略的選擇過程。這樣的設計方式特別適合於需要支援多種策略,且頻繁更換策略的情境,例如付款方法或運輸方法等。希望這些增加的實務案例和解釋能夠滿足你的需求!🚀