在策略模式中,有三个主要的角色:
- Context(上下文):它是包含策略的对象,负责将请求委派给具体的策略对象。
- Strategy(策略):它定义了一个接口或抽象类,用于封装具体算法的行为。
- Concrete Strategy(具体策略):它实现了策略接口,定义了具体的算法。
策略模式的核心思想是将不同的算法封装成独立的策略类,每个类负责处理特定的算法。上下文对象根据需要选择合适的策略对象来执行相应的算法。
策略模式的优点包括:
- 提供了一种灵活的方式来选择算法,使得算法可以独立于客户端而变化。
- 遵循开闭原则,新增策略不会修改现有的代码。
- 代码结构更清晰,各个策略可以独立进行单元测试。
然而,策略模式也有一些缺点:
- 增加了类的数量,特别是当策略较多时。
- 客户端需要了解不同的策略,可能增加了客户端的复杂性。
package main
import "fmt"
// PaymentStrategy 定义支付策略接口
type PaymentStrategy interface {
Pay(amount float64)
}
// CashPaymentStrategy 现金支付策略
type CashPaymentStrategy struct{}
func (c *CashPaymentStrategy) Pay(amount float64) {
fmt.Printf("支付了 %.2f 元现金\n", amount)
}
// CreditCardPaymentStrategy 信用卡支付策略
type CreditCardPaymentStrategy struct{}
func (c *CreditCardPaymentStrategy) Pay(amount float64) {
fmt.Printf("支付了 %.2f 元信用卡\n", amount)
}
// PaymentContext 支付上下文对象
type PaymentContext struct {
strategy PaymentStrategy
}
func (p *PaymentContext) SetStrategy(strategy PaymentStrategy) {
p.strategy = strategy
}
func (p *PaymentContext) Pay(amount float64) {
p.strategy.Pay(amount)
}
func main() {
payment := &PaymentContext{}
// 使用现金支付策略
payment.SetStrategy(&CashPaymentStrategy{})
payment.Pay(100.50)
// 使用信用卡支付策略
payment.SetStrategy(&CreditCardPaymentStrategy{})
payment.Pay(200.75)
}