Golang实现模板模式+策略模式+工厂模式的简单示例

定义策略

// 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()
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值