所處的公司環境我就很少說了,在上一篇博文中已經說了一下。公司整個業務體系中包含有支付模塊,支付的業務分類以下: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; } }
從僞代碼中看出,這種實現方式,是沒大問題的,可是擴展性和靈活性很低。每當增長一個新業務,就必須得更改支付流程的核心類(在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(); }
調用者的實現:
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)增長新的須要付費服務,也是實現一下抽象命令
對當前這麼模型在實際生產中能夠直接用,也能夠進行一些優化後再使用。能夠對命令和支付方式進行工廠封裝。能夠進一步提升靈活性。
完整示例:https://github.com/monkeyming/command
命令模式的介紹能夠參考一下:http://www.cnblogs.com/hpuCode/p/5455254.html