• 策略模式 + 工厂模式 + 门面模式 实现用户多类型支付功能


    目录

    1.新建策略类

    2.创建策略工厂

    3.创建策略的上下文角色

    4.提供统一的访问入口

    5.创建 Controller 层,进行调用

    ​​​​​​​6.进行postman测试


     

    • 需求:用户进行支付
    • 1.目前支持支付宝支付和微信支付,未来会新增银行卡,余额等方式。使用策略模式,每一种支付方式都是一种策略。
    • 2.根据用户传入的支付类型,创建不同的策略类,使用工厂模式。
    • 3.封装一个facade的jar包,其他系统直接通过一个统一的入口,进行该功能的调用,使用门面模式。

    1.新建策略类

    1. @Service
    2. public interface PayStrategy {
    3. Boolean pay(Paybody paybody);
    4. }
    5. public class WxPayStrategy implements PayStrategy {
    6. @Override
    7. public Boolean pay(Paybody paybody) {
    8. // 模拟微信支付过程
    9. System.out.println("微信支付失败!");
    10. return false;
    11. }
    12. }
    13. public class ZfbPayStrategyPay implements PayStrategy{
    14. @Override
    15. public Boolean pay(Paybody paybody) {
    16. // 模拟支付宝支付过程
    17. System.out.println("支付宝支付成功!");
    18. return true;
    19. }
    20. }
    21. @Data
    22. public class Paybody {
    23. /**
    24. * 支付类型
    25. * ZFB 支付宝
    26. * WX 微信
    27. */
    28. private String type;
    29. /**
    30. * 商品
    31. */
    32. private String product;
    33. }

    2.创建策略工厂

    1. /**
    2. * 支付策略工厂
    3. */
    4. public class StrategyFactory {
    5. public static PayStrategy getPayStrategy(String type){
    6. // 1.通过枚举中的type获取对应value
    7. String value = EnumUtil.getFieldBy(PayStrategyEnum::getValue, PayStrategyEnum::getType, type);
    8. // 2.使用反射创建对应的策略类
    9. PayStrategy payStrategy = ReflectUtil.newInstance(value);
    10. return payStrategy;
    11. }
    12. }
    13. /**
    14. * 支付策略枚举
    15. */
    16. public enum PayStrategyEnum {
    17. ZFB("ZFB","com.example.demo.pay.stragety.ZfbPayStrategyPay"),
    18. WX("WX","com.example.demo.pay.stragety.WxPayStrategy")
    19. ;
    20. String type;
    21. String value;
    22. PayStrategyEnum(String type,String value){
    23. this.type = type;
    24. this.value = value;
    25. }
    26. public String getValue() {
    27. return value;
    28. }
    29. public String getType() {
    30. return type;
    31. }
    32. }

    3.创建策略的上下文角色

    起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

    1. public class PayContext {
    2. private PayStrategy payStrategy;
    3. public PayContext(PayStrategy payStrategy) {
    4. this.payStrategy = payStrategy;
    5. }
    6. public Boolean execute(Paybody paybody) {
    7. return this.payStrategy.pay(paybody);
    8. }
    9. }

    4.提供统一的访问入口

    1. public class StrategyFacade {
    2. public static Boolean Pay(Paybody paybody){
    3. // 1.获取策略对象
    4. PayStrategy payStrategy = StrategyFactory.getPayStrategy(paybody.getType());
    5. // 2.获取策略上下文
    6. PayContext payContext = new PayContext(payStrategy);
    7. // 3.进行扣款
    8. return payContext.execute(paybody);
    9. }
    10. }

    5.创建 Controller 层,进行调用

    1. @RestController
    2. public class PayController {
    3. @Autowired
    4. private PayService payService;
    5. @PostMapping("/pay")
    6. public Boolean pay(@RequestBody Paybody paybody){
    7. return payService.Pay(paybody);
    8. }
    9. }
    10. @Service
    11. public class PayService {
    12. public Boolean Pay(Paybody paybody){
    13. if (!EnumUtil.contains(PayStrategyEnum.class, paybody.getType())) {
    14. throw new IllegalArgumentException("不支持的支付方式!");
    15. }
    16. return StrategyFacade.Pay(paybody);
    17. }
    18. }

    6.进行postman测试

  • 相关阅读:
    User Account Status 在CDB 和PDB不一致的情况 OPEN & IN ROLLOVER
    Evil.js
    Firefox火狐浏览器显示你的连接不安全,是什么意思?
    上位机通过Modbus转Profinet网关与CGV300变频器通讯配置案例
    将Xml转为Map集合工具类
    arguments对象
    OpenCV学习(二)——OpenCV中绘图功能
    GitLab 知识树(二):gitlab社区版安装
    【linux基础】6. 日志,日志管理服务,自定义日志等
    【Flink入门修炼】2-3 Flink Checkpoint 原理机制
  • 原文地址:https://blog.csdn.net/sinat_35395498/article/details/127607694