【设计模式】 策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并且使它们之间可以互相替换。该模式使得算法可以独立于使用它的客户端而变化。
下面是一个使用 Golang 实现策略模式的示例代码:
package main
import "fmt"
type PaymentStrategy interface {
Pay(amount float64) error
}
type CreditCardStrategy struct{}
func (cc *CreditCardStrategy) Pay(amount float64) error {
fmt.Printf("Paid %0.2f using Credit Card.\n", amount)
return nil
}
type PayPalStrategy struct{}
func (pp *PayPalStrategy) Pay(amount float64) error {
fmt.Printf("Paid %0.2f using PayPal.\n", amount)
return nil
}
type PaymentContext struct {
strategy PaymentStrategy
}
func (pc *PaymentContext) SetPaymentStrategy(strategy PaymentStrategy) {
pc.strategy = strategy
}
func (pc *PaymentContext) MakePayment(amount float64) error {
return pc.strategy.Pay(amount)
}
func main() {
creditCardStrategy := &CreditCardStrategy{}
payPalStrategy := &PayPalStrategy{}
paymentContext := &PaymentContext{}
// 使用信用卡支付
paymentContext.SetPaymentStrategy(creditCardStrategy)
paymentContext.MakePayment(100.00)
// 使用 PayPal 支付
paymentContext.SetPaymentStrategy(payPalStrategy)
paymentContext.MakePayment(200.00)
}
在上面的代码中,我们定义了一个 PaymentStrategy 接口,该接口包含一个 Pay 方法,用于支付指定金额。接下来,我们定义了两个具体的支付策略类:CreditCardStrategy 和 PayPalStrategy,它们实现了 PaymentStrategy 接口的 Pay 方法。
我们还定义了一个 PaymentContext 结构体,该结构体包含一个 strategy 字段,用于存储当前的支付策略。PaymentContext 结构体还定义了两个方法:SetPaymentStrategy 用于设置支付策略,MakePayment 用于执行支付操作。
最后,在 main 函数中,我们创建了一个 CreditCardStrategy 和 PayPalStrategy 实例,并分别使用它们来进行支付。可以看到,在 MakePayment 方法中,我们只需要调用 strategy.Pay(amount) 来执行支付操作,而无需关心具体的支付策略是什么。这正是策略模式的优势所在,它将算法的实现细节与客户端代码隔离开来,使得客户端代码更加简洁和易于维护。