支付模式优化

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、模型优化

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

                                                                                                                                                                                        本文为摘抄

原文地址:https://www.cnblogs.com/UC0079/p/5609249.html