0


使用设计模式解决支付问题


💖开始前给大家推荐一款很火的刷题、面试求职网站💕https://www.nowcoder.com/link/pc_csdncpt_xiaoying_java

近期负责的项目中有关于支付的功能,由于整合了多个渠道的支付类型要很多if/else/switch 等等判断的写法太low了判断,使代码看着不优雅,且后期不好维护,所有整合桥接模式+简单工厂模式重构这个支付系统,这中间或许也存在着不足。希望可以得到大家的理解和建议。在调用第三方接口支付时具体细节(此处不做详细阐述)。

没用桥接模式的代码:

  1. switch (param.getPayType()) {
  2. case 1:// 微信支付
  3. if (param.getPlace() == 1) {
  4. // JSAPI支付
  5. } else if (param.getPlace() == 2) {
  6. // app
  7. } else if (order.getPlace() == 3) {
  8. // H5支付
  9. } else if (order.getPlace() == 4) {
  10. // Native支付
  11. } else {
  12. // 支付异常
  13. }
  14. case 2:
  15. // 支付宝支付 .....
  16. case 3:
  17. // 积分支付...
  18. case 4:
  19. // 积分+微信支付 ...
  20. case ...
  21. }

** 使用桥接模式后的代码:**

  1. Pay pay = SimpleFactory.factoryMake(2);
  2. Object transfer = pay.transfer("请求参数...");

👏 介绍

桥接模式:桥接模式的主要作用就是通过将抽象部分与实现部分分离,把多种可匹配的使用进行组合。

简单工厂模式:简单工厂模式就是定义一个工厂接口,将实际工作对象推迟到子类工厂对象中,如果功能不多一个工厂类就可以实现就叫简单工厂模式。

桥接模式优点:

1.抽象与实现分离,有助于对系统进行分层,从而产生更好的结构化的系统

2.扩展能力强;桥梁模式使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大提高系统的可扩展性

3.单一职责的原则

3.其实现细节对客户透明

缺点:

由于聚合关系建立在抽象层,要求开发者对抽象化进行设计与编程,能正确的识别出系统中两个独立变化的维度,增加了系统的理解与设计难度

使用环境:

1.不希望使用继承或多层次继承导致系统类的数急剧增长的系统;

2.一个类存在两个独立的维度,而且这两个维度都需要进行扩展

🤷‍♂️ 实现

这里分别模拟两个支付渠道:微信(APP支付、H5支付...)、支付宝(APP支付...) 当然支付不止这些还有更多渠道,自己添加对应的实现类即可(下图拿脚画的看看就好,别认真)

** 🐱‍👤 抽象类:**

  1. import com.alibaba.fastjson.JSONObject;
  2. public abstract class Pay {
  3. /**
  4. * 具体支付方式:APP、H5、Native...
  5. */
  6. protected IPayMode payMode;
  7. /**
  8. * 支付方式:支付宝、微信...
  9. *
  10. * @param payMode
  11. */
  12. public Pay(IPayMode payMode) {
  13. this.payMode = payMode;
  14. }
  15. /**
  16. * 支付接口,创建预支付订单
  17. *
  18. * @return
  19. */
  20. public abstract Object transfer(JSONObject param);
  21. }

继承抽象类实现 各种支付方式:

支付宝

  1. public class Alipay extends Pay {
  2. public Alipay(IPayMode payMode) {
  3. super(payMode);
  4. }
  5. public Object transfer(JSONObject param) {
  6. System.out.println("开始模拟支付宝支付...");
  7. Object res = payMode.payMode(param);
  8. return res;
  9. }
  10. }

微信

  1. public class WeChat extends Pay {
  2. public WeChat(IPayMode payMode) {
  3. super(payMode);
  4. }
  5. public Object transfer(JSONObject param) {
  6. System.out.println("开始模拟微信支付...");
  7. Object res = payMode.payMode(param);
  8. return res;
  9. }
  10. }

🐱‍🏍 支付方法接口:

  1. public interface IPayMode {
  2. /**
  3. * 具体支付的方法
  4. *
  5. * @param param
  6. * @return
  7. */
  8. Object payMode(JSONObject param);
  9. }

支付宝-APP支付

  1. public class AlipayApp implements IPayMode {
  2. @Override
  3. public Object payMode(JSONObject param) {
  4. System.out.println("支付方式:APP支付");
  5. return "支付宝支付—APP预支付订单创建成功";
  6. }
  7. }

微信-APP支付

  1. public class WeChatApp implements IPayMode {
  2. @Override
  3. public Object payMode(JSONObject param) {
  4. System.out.println("支付方式:APP支付");
  5. return "微信支付—APP预支付订单创建成功";
  6. }
  7. }

微信-H5支付

  1. public class WeChatH5 implements IPayMode {
  2. @Override
  3. public Object payMode(JSONObject param) {
  4. System.out.println("支付方式:H5支付");
  5. return "微信支付—H5预支付订单创建成功";
  6. }
  7. }

测试1:

  1. void uploading() {
  2. System.out.println("\r\n模拟测试场景:微信支付");
  3. Pay wxPay = new WeChat(new WeChatH5());
  4. JSONObject param = new JSONObject();
  5. Object pay = wxPay.transfer(param);
  6. System.out.println( pay);
  7. System.out.println("\r\n模拟测试场景:支付宝支付");
  8. Pay zfbPay = new Alipay(new AlipayApp());
  9. Object transfer = zfbPay.transfer(param);
  10. System.out.println(transfer);
  11. }

到这里可以发现想要什么支付,并且想要什么样的支付方式,直接new即可,但是由于前端交互的参数过来还是要if...else判断是微信支付还是支付宝支付,然后在嵌套if...else判断是APP、Native、H5...支付方式,多写一句if...else不就是要我的命吗?

所有用一个简单的工厂来做这个事情。

  1. public class SimpleFactory {
  2. // 支付宝APP支付
  3. public static final int ALI_PAY_APP = 1;
  4. // 微信APP支付
  5. public static final int WE_CHAT_APP = 2;
  6. // 微信H5支付
  7. public static final int WE_CHAT_H5 = 3;
  8. public static Pay factoryMake(int type) {
  9. switch (type) {
  10. case ALI_PAY_APP:
  11. return new Alipay(new AlipayApp());
  12. case WE_CHAT_APP:
  13. return new WeChat(new WeChatApp());
  14. case WE_CHAT_H5:
  15. return new WeChat(new WeChatH5());
  16. }
  17. return null;
  18. }
  19. }

测试2:

  1. Pay pay = SimpleFactory.factoryMake(2);
  2. Object transfer = pay.transfer(new JSONObject());
  3. System.out.println("transfer = " + transfer);

总结:

从结果中可以得出根据不同的type,就可以取不同的支付方式了,虽然类变多了,但是维护方便了,比起if/else/switch 相比调用方式更加简洁、干净、易使用,且满足单一职责和开闭原则,让每一部分内容都很清晰易于维护和拓展,外部使用接口的用户不需要关心具体的实现,只要传入对应的参数即可。


本文转载自: https://blog.csdn.net/weixin_46522803/article/details/126349630
版权归原作者 小影~ 所有, 如有侵权,请联系我们删除。

“使用设计模式解决支付问题”的评论:

还没有评论