支付業務的優化(命令模式的應用)

一、業務現狀

  所處的公司環境我就很少說了,在上一篇博文中已經說了一下。公司整個業務體系中包含有支付模塊,支付的業務分類以下:html

  a)發佈各種房源git

  b)購買各種會員(雖然沒用戶,可是功能存在)github

  c)購買各類服務web

  d)購買理財微信

  大概就這幾類了,支付這塊的調整主要是在web頁面顯示的文字上的調整,真正的支付邏輯,幾乎是不動的,那優化什麼呢?這個主要仍是技術層面從軟件的靈活性和擴展性考慮進行優化的。其實各個公司的支付業務應該都是差很少的,至少是支付這塊的邏輯!整個流程都大差不差的。dom

二、當前實現

  整個支付流程的流程是調用支付接口,與餘額或者第三方支付平臺交互,成功後回調完成對應的支付操做。流程圖以下:ide

  現有操做的僞代碼以下:微信支付

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;
    }

}
View Code

  從僞代碼中看出,這種實現方式,是沒大問題的,可是擴展性和靈活性很低。每當增長一個新業務,就必須得更改支付流程的核心類(在switch中增長新的選項),隨着業務的增長迭代,又沒有明確的下線,和代碼優化,致使整個支付類代碼很是臃腫,可讀性不好。優化

三、優化實現

  基於現有的支付流程,從擴展性和靈活性的角度出發,對這個現有的業務進行重構和優化。類圖以下:this

示例關鍵代碼

命令抽象類:

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();
}
View Code

調用者的實現:

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("支付失敗");
        }

    }
}
View Code

  對業務代碼進行優化後,擴展性和靈活性大大增長。

  a)若是須要增長支付方式,只須要實現特定的接口;

  b)增長新的須要付費服務,也是實現一下抽象命令

四、模型優化

  對當前這麼模型在實際生產中能夠直接用,也能夠進行一些優化後再使用。能夠對命令和支付方式進行工廠封裝。能夠進一步提升靈活性。

完整示例:https://github.com/monkeyming/command

命令模式的介紹能夠參考一下:http://www.cnblogs.com/hpuCode/p/5455254.html

相關文章
相關標籤/搜索