策略模式(Strategy Pattern)

未匹配的标注

策略模式(Strategy Pattern)是一种面向对象编程设计模式,它允许在运行时动态地改变算法或策略的选择,从而使算法的变化独立于使用它的客户端。这种模式通过将算法封装在单独的类中,使得它们可以相互替换,并使得它们易于理解、扩展和维护。

下面是一个使用 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\n", amount)
    return nil
}

type PayPalStrategy struct {
    email string
    password string
}

func (p *PayPalStrategy) Pay(amount float64) error {
    fmt.Printf("Paying %0.2f using PayPal\n", amount)
    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)
}

在上面的代码中,首先定义了一个 PaymentStrategy 接口,其中定义了一个 Pay 方法,用于实现具体的支付策略。然后,定义了两个具体的支付策略,分别是信用卡支付策略和 PayPal 支付策略,它们都实现了 PaymentStrategy 接口的 Pay 方法。

接着,定义了一个 PaymentContext 上下文类,用于维护支付的金额和所选择的支付策略。在 NewPaymentContext 函数中,通过传入支付的金额和支付策略,创建了一个新的 PaymentContext 实例。在 Pay 方法中,调用了当前支付策略的 Pay 方法,并将支付的金额作为参数传递。

最后,可以在客户端代码中使用上面的代码来实现不同的支付策略,例如:

func main() {
    creditCardStrategy := &CreditCardStrategy{
        name: "John Doe",
        cardNumber: "1234 5678 9012 3456",
        cvv: "123",
        date: "01/22",
    }
    paymentContext := NewPaymentContext(100, creditCardStrategy)
    paymentContext.Pay()

    payPalStrategy := &PayPalStrategy{
        email: "john.doe@example.com",
        password: "mypassword",
    }
    paymentContext = NewPaymentContext(200, payPalStrategy)
    paymentContext.Pay()
}

在上面的代码中,首先创建了一个信用卡支付策略的实例,并将其传入到 NewPaymentContext 函数中,创建了一个新的 PaymentContext 实例。然后,调用了 Pay 方法,这会调用信用卡支付策略的 Pay 方法,并将支付的金额作为参数传递。

接着,创建了一个 PayPal 支付策略的实例,并通过调用 NewPaymentContext 函数创建了一个新的 PaymentContext 实例。然后,再次调用了 Pay 方法,这会调用 PayPal 支付策略的 Pay 方法,并将支付的金额作为参数传递。

使用策略模式,可以轻松地切换不同的支付策略,而不需要修改客户端代码。这使得代码更具灵活性和可维护性。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~