• 采用策略模式实现订单支付多种方式


    背景

    项目中订单支付为常见的功能,一般的订单支付都会包含多种方式,例如聚合支付、会员支付、积分支付的等多种方式,如果采用传统的方式来实现,需要使用多个if/else条件判断,本文将介绍如何采用策略+工厂模式实现多种方式的订单支付问题。

    简介

    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

    基本原理

    基本元素组成如下:

    • 环境 (Context):持有一个策略类的引用,最终给客户端调用。
    • 抽象策略 (Strategy): 策略类,通常是一个接口或者抽象类。
    • 具体策略 (ConcreteStrategy):实现了策略类中的策略方法,封装相关的算法和行为。

    具体实现

    定义抽象策略

    1. public interface PayWayService
    2. {
    3. Result pay(WxPayObject wxpayObject);
    4. }

    说明:定义抽象支付接口。

    具体策略

    微信支付

    1. @Component("wx")
    2. public class WxPayWayServiceImpl implements PayWayService
    3. {
    4. private Logger logger =
    5. LoggerFactory.getLogger(WxPayWayServiceImpl.class);
    6. @Override
    7. public Result pay(WxPayObject wxPayObject)
    8. {
    9. logger.info("this is wx pay way");
    10. return Result.success(wxPayObject);
    11. }
    12. }

    说明:注意@Component注解需要写入别名。

    支付宝支付

    1. @Component("zfb")
    2. public class ZfbPayWayServiceImpl implements PayWayService
    3. {
    4. private Logger logger =
    5. LoggerFactory.getLogger(ZfbPayWayServiceImpl.class);
    6. @Override
    7. public Result pay(WxPayObject wxpayObject)
    8. {
    9. logger.info("this is zfb pay way");
    10. return Result.success(wxpayObject);
    11. }
    12. }

    会员支付

    1. @Component("member")
    2. public class MemberPayWayServiceImpl implements PayWayService
    3. {
    4. private Logger logger =
    5. LoggerFactory.getLogger(MemberPayWayServiceImpl.class);
    6. @Override
    7. public Result pay(WxPayObject wxpayObject)
    8. {
    9. logger.info("this is member pay way");
    10. return Result.success(wxpayObject);
    11. }
    12. }

    工厂类

    1. @Component
    2. public class PayWayFactory
    3. {
    4. @Autowired
    5. private Map<String, PayWayService> paywayServiceMap;
    6. public PayWayService getPayWayService(String type)
    7. {
    8. PayWayService payWayService = paywayServiceMap.get(type);
    9. if(payWayService==null)
    10. {
    11. throw new RuntimeException("未指定的支付类型");
    12. }
    13. return payWayService;
    14. }
    15. }

    说明:通过工厂类获取具体的策略实现。

    1. private Map<String, PayWayService> paywayServiceMap

    @Autowired 标注作用于Map类型时,如果Map的key为String类型,则Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 iD 或 name 作为Map的key。

    测试

    1. @RestController
    2. public class TestController
    3. {
    4. @Autowired
    5. private PayWayFactory payWayFactory;
    6. @RequestMapping("/getPayWay")
    7. public void getPayWay(@RequestParam String payWay)
    8. {
    9. WxPayObject wxpayObject =new WxPayObject();
    10. payWayFactory.getPayWayService(payWay).pay(wxpayObject);
    11. }
    12. }

    输入 payway分别输入wx和member输出结果如下:

    策略模式优缺点

    优点

    • 提供了管理相关的算法族的办法,从而避免重复的代码。
    • 提供了可以替换继承关系的办法。因为继承使得动态改变算法或行为变得不可能。
    • 可以避免使用多重条件转移语句。

    缺点

    • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
    • 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

    总结

    本文对策略模式进行了讲解,策略模式在实际开发过程中应用的比较广泛,所以大家还是需要熟练的掌握其用法,如有疑问,请随时反馈。

  • 相关阅读:
    使用Scrapy框架集成Selenium实现高效爬虫
    Linux操作系统裸机开发-环境搭建
    自动化运维CICD
    Android -- 每日一问:如何理解 Gradle?Gradle 在 Android 的构建过程中有什么作用?
    Linux常见命令手册
    Python网络爬虫(一):HTML/CSS/JavaScript介绍
    C语言-字符串与输入输出
    在linux反编译安卓apk并修改AndroidManifest.xml的值
    C++ 不知算法系列之深入动态规划算法思想
    第十五届蓝桥杯总结
  • 原文地址:https://blog.csdn.net/weixin_62421895/article/details/126521238