package main
import (
"fmt"
)
// 支付接口
type Payment interface {
Pay(amount float64) string
}
// 支付宝支付结构体
type AlipayPayment struct{}
func (a AlipayPayment) Pay(amount float64) string {
return fmt.Sprintf("使用支付宝支付 %.2f 元", amount)
}
// 微信支付结构体
type WechatPayment struct{}
func (w WechatPayment) Pay(amount float64) string {
return fmt.Sprintf("使用微信支付 %.2f 元", amount)
}
// 银行卡支付结构体
type BankCardPayment struct{}
func (b BankCardPayment) Pay(amount float64) string {
return fmt.Sprintf("使用银行卡支付 %.2f 元", amount)
}
// 订单结构体,包含支付策略
type Order struct {
payment Payment
}
// 设置支付策略
func (o *Order) SetPayment(payment Payment) {
o.payment = payment
}
// 执行支付
func (o *Order) Pay(amount float64) string {
if o.payment == nil {
return "未设置支付方式"
}
return o.payment.Pay(amount)
}
代码解释
- 接口:
Payment
接口定义了 Pay
方法,它抽象了支付的行为。所有具体的支付方式(支付宝、微信、银行卡)都必须实现这个接口。这是策略模式中策略的抽象定义。
- 结构体:
AlipayPayment
、WechatPayment
和 BankCardPayment
结构体分别代表不同的支付方式。它们实现了 Payment
接口的 Pay
方法,各自包含具体的支付逻辑。这是策略模式中的具体策略实现。
Order
结构体包含一个 Payment
类型的字段,它持有一个支付策略实例。SetPayment
方法用于设置具体的支付策略,Pay
方法调用当前设置的支付策略的 Pay
方法来执行支付操作。这是策略模式中的上下文,它通过组合的方式使用具体策略。
- 协作体现策略模式:
Order
结构体作为上下文,依赖于 Payment
接口而不是具体的支付结构体。这样,Order
可以在运行时动态地切换不同的支付策略(具体的支付结构体)。
- 具体的支付结构体实现
Payment
接口,使得它们可以被 Order
结构体所使用。这种松耦合的设计,符合策略模式的思想,即把不同的算法(支付逻辑)封装到不同的策略类中,上下文可以根据需要选择不同的策略。