zoukankan      html  css  js  c++  java
  • 支付模式优化

    1、业务现状

        公司整个业务体系中包含有支付模块,支付的业务分类如下:

      a)发布各类房源

      b)购买各类会员(虽然没用户,但是功能存在)

      c)购买各种服务

      d)购买理财

      大概就这几类了,支付这块的调整主要是在web页面显示的文字上的调整,真正的支付逻辑,几乎是不动的,那优化什么呢?这个主要还是技术层面从软件的灵活性和扩展性考虑进行优化的。其实各个公司的支付业务应该都是差不多的,至少是支付这块的逻辑!整个流程都大差不差的。

    2、当前实现

      整个支付流程的流程是调用支付接口,与余额或者第三方支付平台交互,成功后回调完成对应的支付操作。流程图如下:

      现有操作的伪代码如下:

    复制代码
    package cn.simple.old;
    
    import cn.simple.old.domain.PayModel;
    
    /**
     * 现状的支付模块的实现伪代码
     * 
     * @author ldm
     * @Date 2016年6月22日
     */
    public class OldPay {
    
        public PayModel pay(PayModel model) {
    
            switch (model.getPayType()) {
            case 1:
                // 余额支付
                model.setPaySuccess(payThird());
                break;
            case 2:
                // 支付宝支付
                model.setPaySuccess(payThird());
                break;
            case 3:
                // 微信支付
                model.setPaySuccess(payThird());
                break;
            case 4:
                // 网银
                model.setPaySuccess(payThird());
                break;
            default:
                model.setPaySuccess(false);
                break;
            }
            if (model.isPaySuccess()) {
                return callback(model);
            } else {
                return model;
            }
        }
    
        public PayModel callback(PayModel model) {
            switch (model.getType()) {
            case 1:
                // 买会员
                model.setOprSuccess(callBackOpr());
                break;
            case 2:
                // 买服务
                model.setOprSuccess(callBackOpr());
                break;
            case 3:
                // 发房
                model.setOprSuccess(callBackOpr());
                break;
            case 4:
                // 理财
                model.setOprSuccess(callBackOpr());
                break;
            default:
                model.setOprSuccess(false);
                break;
            }
            return model;
        }
    
        //////////////////////////// 这是模拟第三方支付的(不同的支付方会有不同的实现)/////////////////////////////
        private boolean payThird() {
            // 支付的参数配置。。。
            return true;
        }
        /////////////////////////////// 回调具体操作///////////////////////////////////
        public boolean callBackOpr()
        {
            return true;
        }
    
    }
    复制代码

      从伪代码中看出,这种实现方式,是没大问题的,但是扩展性和灵活性很低。每当增加一个新业务,就必须得更改支付流程的核心类(在switch中增加新的选项),随着业务的增加迭代,又没有明确的下线,和代码优化,导致整个支付类代码非常臃肿,可读性很差。

    3、优化实现

      基于现有的支付流程,从扩展性和灵活性的角度出发,对这个现有的业务进行重构和优化。类图如下:

    示例关键代码

    命令抽象类:

    复制代码
    package cn.simple.command.impl;
    
    import cn.simple.command.ICommand;
    import cn.simple.pay.IPay;
    
    /**
     * 命令抽象类
     * 
     * @author ldm
     * @Date 2016年6月22日
     */
    public abstract class AbstractPayCommand implements ICommand {
        protected IPay pay;
    
        public AbstractPayCommand(IPay pay) {
            this.pay = pay;
        }
    
        public abstract void setPay(IPay pay);
    
        /**
         * 执行命令
         * 
         * @author ldm
         * @return
         * @Date 2016年6月22日
         */
        public String doCommand() {
            System.out.println("执行命令");
            String payResult = pay.doPay();
            if (payResult.startsWith("1,")) {
                boolean cb = cmdCallback();
                if (cb) {
                    payResult += "^1";
                } else {
                    payResult += "^0";
                }
    
                return payResult;
            } else {
                return "^0";
            }
    
        }
    
        /**
         * 命令回调
         * 
         * @author ldm
         * @return
         * @Date 2016年6月22日
         */
        public abstract boolean cmdCallback();
    }
    复制代码

    调用者的实现:

    复制代码
    package cn.simple.invoker;
    
    import cn.simple.command.impl.AbstractPayCommand;
    import cn.simple.command.impl.ServiceCommand;
    import cn.simple.pay.impl.Alipay;
    /**
     * 购买服务调用
     * @author ldm
     * @Date 2016年6月22日
     */
    public class ServiceInvoker {
        public static void main(String[] args) {
            /**
             * 支付方式让用户确定
             */
            AbstractPayCommand cmd = new ServiceCommand(new Alipay());
            String result = cmd.doCommand();
            System.out.println("命令执行结果:"+result);
            if (result.startsWith("1,")) {
                System.out.println("支付成功");
                if (result.endsWith("^0")) {
                    System.out.println("操作失败");
                } else {
                    System.out.println("操作成功");
                }
            } else {
                System.out.println("支付失败");
            }
    
        }
    }
    复制代码

      对业务代码进行优化后,扩展性和灵活性大大增加。

      a)如果需要增加支付方式,只需要实现特定的接口;

      b)增加新的需要付费服务,也是实现一下抽象命令

    4、模型优化

      对当前这么模型在实际生产中可以直接用,也可以进行一些优化后再使用。可以对命令和支付方式进行工厂封装。可以进一步提高灵活性。

                                                                                                                                                                                            本文为摘抄

  • 相关阅读:
    2021.07.13 学习总结
    2021.07.12 学习总结
    2021.07.11 学习总结
    form表单提交失败
    url传参和解决中文乱码
    layui日期选择无效的问题
    Eclipse中快速生成Javabean的方法
    一种控制台输出效果的方法
    暑期周总结
    环境配置2
  • 原文地址:https://www.cnblogs.com/UC0079/p/5609249.html
Copyright © 2011-2022 走看看