策略模式(Strategy Pattern) | 您所在的位置:网站首页 › go语言设计模式是什么 › 策略模式(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: "[email protected]", password: "mypassword", } paymentContext = NewPaymentContext(200, payPalStrategy) paymentContext.Pay() }在上面的代码中,首先创建了一个信用卡支付策略的实例,并将其传入到 NewPaymentContext 函数中,创建了一个新的 PaymentContext 实例。然后,调用了 Pay 方法,这会调用信用卡支付策略的 Pay 方法,并将支付的金额作为参数传递。 接着,创建了一个 PayPal 支付策略的实例,并通过调用 NewPaymentContext 函数创建了一个新的 PaymentContext 实例。然后,再次调用了 Pay 方法,这会调用 PayPal 支付策略的 Pay 方法,并将支付的金额作为参数传递。 使用策略模式,可以轻松地切换不同的支付策略,而不需要修改客户端代码。这使得代码更具灵活性和可维护性。 本文章首发在 LearnKu.com 网站上。 |
CopyRight 2018-2019 实验室设备网 版权所有 |