定义策略
// PayStrategy 付款策略
type PayStrategy interface {
// PayCodePay 付款码支付
PayCodePay()
// OrderQuery 订单查询
OrderQuery()
// Reverse 撤销
Reverse()
// Refund 退款
Refund()
// RefundQuery 退款查询
RefundQuery()
// RefundNotify 退款通知
RefundNotify()
// GetUserId 查询用户ID
GetUserId()
}
定义上下文
// PayContext 支付上下文
type PayContext struct {
// 提供支付能力的接口实现
Strategy PayStrategy
}
// NewPayContext
/**
* @Description: 创建支付上下文
* @param p
* @return *PayContext
*/
func NewPayContext(p PayStrategy) *PayContext {
return &PayContext{
Strategy: p,
}
}
定义模板
// PayTemplate 支付模板
type PayTemplate struct {
Strategy PayStrategy
}
func (p *PayTemplate) ScanPay() {
// 先调用付款接口
p.Strategy.PayCodePay()
// 然后对订单结果进行轮训
for i := 0; i < 5; i++ {
p.Strategy.OrderQuery()
}
}
实现付款策略
// ALiPayStrategy 支付宝支付策略
type ALiPayStrategy struct{}
func (aLiPay *ALiPayStrategy) PayCodePay() {
fmt.Println("【支付宝】付款码支付")
}
func (aLiPay *ALiPayStrategy) OrderQuery() {
fmt.Println("【支付宝】订单查询")
}
func (aLiPay *ALiPayStrategy) Reverse() {
fmt.Println("【支付宝】撤销")
}
func (aLiPay *ALiPayStrategy) Refund() {
fmt.Println("【支付宝】退款")
}
func (aLiPay *ALiPayStrategy) RefundQuery() {
fmt.Println("【支付宝】退款查询")
}
func (aLiPay *ALiPayStrategy) RefundNotify() {
fmt.Println("【支付宝】退款通知")
}
func (aLiPay *ALiPayStrategy) GetUserId() {
fmt.Println("【支付宝】查询用户ID")
}
// WeChatPayStrategy 微信支付策略
type WeChatPayStrategy struct{}
func (w WeChatPayStrategy) PayCodePay() {
fmt.Println("【微信】付款码支付")
}
func (w WeChatPayStrategy) OrderQuery() {
fmt.Println("【微信】订单查询")
}
func (w WeChatPayStrategy) Reverse() {
fmt.Println("【微信】撤销")
}
func (w WeChatPayStrategy) Refund() {
fmt.Println("【微信】退款")
}
func (w WeChatPayStrategy) RefundQuery() {
fmt.Println("【微信】退款查询")
}
func (w WeChatPayStrategy) RefundNotify() {
fmt.Println("【微信】退款通知")
}
func (w WeChatPayStrategy) GetUserId() {
fmt.Println("【微信】查询用户ID")
}
// UnionPayStrategy 银联支付策略
type UnionPayStrategy struct{}
func (union *UnionPayStrategy) PayCodePay() {
fmt.Println("【银联】付款码支付")
}
func (union *UnionPayStrategy) OrderQuery() {
fmt.Println("【银联】订单查询")
}
func (union *UnionPayStrategy) Reverse() {
fmt.Println("【银联】撤销")
}
func (union *UnionPayStrategy) Refund() {
fmt.Println("【银联】退款")
}
func (union *UnionPayStrategy) RefundQuery() {
fmt.Println("【银联】退款查询")
}
func (union *UnionPayStrategy) RefundNotify() {
fmt.Println("【银联】退款通知")
}
func (union *UnionPayStrategy) GetUserId() {
fmt.Println("【银联】查询用户ID")
}
调用
const (
WeChatPay = "wx"
ALiPay = "ali"
UnionPay = "union"
)
func main() {
payStrategyMap := make(map[string]gopay.PayStrategy)
payStrategyMap[WeChatPay] = &gopay.WeChatPayStrategy{}
payStrategyMap[ALiPay] = &gopay.ALiPayStrategy{}
payStrategyMap[UnionPay] = &gopay.UnionPayStrategy{}
// 创建支付上下文,选择具体的支付模式
payContext := gopay.NewPayContext(payStrategyMap[UnionPay])
payTemplate := gopay.PayTemplate{}
payTemplate.Strategy = payContext.Strategy
payTemplate.ScanPay()
}