策略模式

策略模式的概念

策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。

策略模式的作用

分离算法:将不同的算法封装在不同的策略类中,使它们可以互换。
扩展性:易于增加新的策略,符合开闭原则。
简化条件判断:避免使用大量的条件语句来选择不同的行为。

策略模式应用场景

多个类只区别在行为:例如,不同的排序算法。

需要在运行时选择算法:例如,根据用户输入选择不同的支付方式。

封装变化:将变化的部分封装起来,使代码更清晰。

Go语言实现策略模式示例

以下是一个使用策略模式的Go语言示例,模拟了不同支付方式的场景:

package main

import (
	"fmt"
)

// PaymentStrategy 定义支付策略接口
type PaymentStrategy interface {
	Pay(amount float64)
}

// CreditCardPayment 实现信用卡支付策略
type CreditCardPayment struct{}

func (c *CreditCardPayment) Pay(amount float64) {
	fmt.Printf("Paid %.2f using Credit Card\n", amount)
}

// PayPalPayment 实现PayPal支付策略
type PayPalPayment struct{}

func (p *PayPalPayment) Pay(amount float64) {
	fmt.Printf("Paid %.2f using PayPal\n", amount)
}

// ShoppingCart 购物车类,包含支付策略
type ShoppingCart struct {
	paymentStrategy PaymentStrategy
}

// SetPaymentStrategy 设置支付策略
func (s *ShoppingCart) SetPaymentStrategy(strategy PaymentStrategy) {
	s.paymentStrategy = strategy
}

// Checkout 结算
func (s *ShoppingCart) Checkout(amount float64) {
	s.paymentStrategy.Pay(amount)
}

func main() {
	// 创建购物车实例
	cart := ShoppingCart{}

	// 使用信用卡支付
	cart.SetPaymentStrategy(&CreditCardPayment{})
	cart.Checkout(100.0)

	// 切换到PayPal支付
	cart.SetPaymentStrategy(&PayPalPayment{})
	cart.Checkout(200.0)
}