策略模式应用:设计三方支付

在我们日常开发中,难免会和第三方接口进行教会。拿支付来举例,我们现在的平台是使用建行支付的,但随着业务的扩增,又引入了招行支付和通联支付。在编写代码的时候,总不能增加一个三方支付就去修改自己业务实现,为此,使用策略模式设计此接口。详见代码。

支付类型枚举
package cn.zxw.strategy;

/**
* @author 华安小书童
* @description 支付类型
* @data: 2022/01/14 20:42
*/
public enum PayType {

  /**
   * 微信支付
   */
  WE_CHAT("WE_CHAT", "微信支付"),
  /**
   * 支付宝支付
   */
  ZFB("ZFB", "支付宝支付"),
  /**
   * 银联支付
   */
  UNION_PAY("UNION_PAY", "银联支付");

  /**
   * 支付名称
   */
  public final String name;
  /**
   * 支付描述
   */
  public final String desc;

  PayType(String name, String desc) {
      this.name = name;
      this.desc = desc;
  }
}

三方支付构建类
package cn.zxw.strategy;

import cn.hutool.extra.spring.SpringUtil;
import cn.zxw.strategy.third_impl.UnionPayServiceImpl;
import cn.zxw.strategy.third_impl.WeChatPayServiceImpl;
import cn.zxw.strategy.third_impl.ZhiFuBaoServiceImpl;
import lombok.AllArgsConstructor;

import java.util.HashMap;
import java.util.Map;

/**
* @author 华安小书童
* @description 初始化三方服务
* @data: 2022/01/14 20:42
*/
@AllArgsConstructor
public class ThirdServiceBuilder {

  private final static Map<String, IThirdPayService> THIRD_PAY_POOL = new HashMap<>(3);

  static {
      THIRD_PAY_POOL.put(PayType.WE_CHAT.name, SpringUtil.getBean(WeChatPayServiceImpl.class));
      THIRD_PAY_POOL.put(PayType.ZFB.name, SpringUtil.getBean(ZhiFuBaoServiceImpl.class));
      THIRD_PAY_POOL.put(PayType.UNION_PAY.name, SpringUtil.getBean(UnionPayServiceImpl.class));
  }

  public static IThirdPayService getThirdPay(String name) {
      return THIRD_PAY_POOL.get(name);
  }
}

己方支付控制器
package cn.zxw.strategy;

import cn.zxw.strategy.service.IPayService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
* @author 华安小书童
* @description 支付控制器
* @data: 2022/01/14 20:42
*/
@RestController
@AllArgsConstructor
public class PayController {

  private final IPayService payService;

  @GetMapping("/test")
  public String test(@RequestParam String name, @RequestParam Integer money) {
      return payService.pay(name, money);
  }
}

己方支付接口
package cn.zxw.strategy.service;

/**
* @author 华安小书童
* @description 支付接口
* @data: 2022/01/14 20:42
*/
public interface IPayService {

  /**
   * 具体支付实现
   *
   * @param type  选择哪个第三方进行支付
   * @param money 金额
   * @return
   */
  String pay(String type, Integer money);

}

己方支付接口实现
package cn.zxw.strategy.service;

import cn.zxw.strategy.IThirdPayService;
import cn.zxw.strategy.ThirdServiceBuilder;
import org.springframework.stereotype.Service;

/**
* @author 华安小书童
* @description 支付实现类
* @data: 2022/01/14 20:42
*/
@Service
public class PayServiceImpl implements IPayService {

  @Override
  public String pay(String type, Integer money) {
      System.out.println("进行支付操作逻辑");
      IThirdPayService thirdPayService = ThirdServiceBuilder.getThirdPay(type);
      thirdPayService.pay(money);
      return "success";
  }
}

三方支付接口 (引入的第三方接口都要实现此接口)
package cn.zxw.strategy;

/**
* @author By: zhangxiongwei
* Package cn.zxw.strategy
* Ceate Time 2022-01-14 15:06
* Copyright 2021 www.jilianjituan.com Inc. All rights reserved.
* 注意:本内容仅限于冀联人力集团内部传阅,禁止外泄以及用于其他的商业目的
*/
public interface IThirdPayService {

  /**
   * 支付
   * @param money 金额
   * @return {string}
   */
  String pay(Integer money);
}

微信支付实现
package cn.zxw.strategy.third_impl;

import cn.zxw.strategy.IThirdPayService;
import org.springframework.stereotype.Component;

/**
* @author 华安小书童
* @description 微信支付具体实现
* @data: 2022/01/14 20:42
*/
@Component
public class WeChatPayServiceImpl implements IThirdPayService {

  @Override
  public String pay(Integer money) {
      System.out.println("WeChat pay " + money);
      return "success";
  }
}
##### 支付宝支付实现
package cn.zxw.strategy.third_impl;

import cn.zxw.strategy.IThirdPayService;
import org.springframework.stereotype.Component;

/**
* @author 华安小书童
* @description 支付宝支付具体支付
* @data: 2022/01/14 20:42
*/
@Component
public class ZhiFuBaoServiceImpl implements IThirdPayService {


  @Override
  public String pay(Integer money) {
      System.out.println("ZhiFuBao pay " + money);
      return "success";
  }
}

至此代码准备完毕,我们进行测试

GET http://localhost:6003/test/?name=ZFB&money=1223

输出信息
输出结果

GET http://localhost:6003/test/?name=ZFB&money=1223

输出信息
输出信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值