策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用,算法的变化不会影响到使用算法的客户。策略模式主要用于算法的切换,让算法的变化独立于使用算法的客户端。
在 Go 语言中实现策略模式,通常会定义一个策略接口,然后为每种算法实现该接口。接着定义一个上下文(Context)来使用这些策略。以下是 Go 语言实现策略模式的一个简单示例:
// 定义策略接口
type PaymentStrategy interface {
Pay(amount float64) error
}
// 实现具体的支付策略
type CreditCardStrategy struct {
name string
cardNumber string
cvv string
date string
}
func (c *CreditCardStrategy) Pay(amount float64) error {
fmt.Printf("Paying %0.2f using credit card %s\n", amount, c.cardNumber)
return nil
}
type PayPalStrategy struct {
email string
password string
}
func (p *PayPalStrategy) Pay(amount float64) error {
fmt.Printf("Paying %0.2f using PayPal account %s\n", amount, p.email)
return nil
}
// 定义上下文类
type PaymentContext struct {
amount float64
strategy PaymentStrategy
}
// 使用策略初始化上下文
func NewPaymentContext(amount float64, strategy PaymentStrategy) *PaymentContext {
return &PaymentContext{
amount: amount,
strategy: strategy,
}
}
// 执行支付,使用策略模式
func (p *PaymentContext) Pay() error {
return p.strategy.Pay(p.amount)
}
// 客户端代码
func main() {
creditCard := &CreditCardStrategy{name: "John Doe", cardNumber: "1234567890123456", cvv: "123", date: "12/24"}
paypal := &PayPalStrategy{email: "user@example.com", password: "password"}
// 创建不同的支付上下文
context1 := NewPaymentContext(100.0, creditCard)
context2 := NewPaymentContext(200.0, paypal)
// 执行支付
if err := context1.Pay(); err != nil {
fmt.Println("Payment failed:", err)
}
if err := context2.Pay(); err != nil {
fmt.Println("Payment failed:", err)
}
}
在这个示例中, PaymentStrategy 是一个策略接口,定义了 Pay 方法。 CreditCardStrategy 和 PayPalStrategy 是具体的策略实现,它们实现了 PaymentStrategy 接口的 Pay 方法。 PaymentContext 是上下文类,它接受一个策略并在 Pay 方法中使用它来执行支付操作。
客户端代码创建了两种支付策略的实例,并使用它们创建了 PaymentContext 对象,然后调用 Pay 方法执行支付。这样,支付方式可以在运行时动态地改变,而不影响使用这些策略的客户端代码。