1.背景:
隨著業務的擴展,下單流程涉及的業務處理越來越多,在原有的設計方案上面增加功能困難,且原有代碼可讀性較差。
2.重構前訂單業務邏輯狀況:
2.1 存在問題:
(1)可讀性差:
大部分邏輯處理代碼在同一個方法內,增加了開發人員讀懂代碼耗費的時間。
(2)可維護性差:
代碼的耦合性高,每次新增功能以及修改BUG,都要對整塊代碼進行全局考慮,防止新增的功能以及修改的BUG對原有的功能產生影響。
2.2 改進方向
(1)增加可讀性,使新來的開發人員以及不是本項目的開發人員可以很好的,很快的讀懂訂單相關的業務邏輯的處理過程。
(2)易維護,減小整個代碼的耦合性,開發人員可以很容易的增加新的功能,而少考慮對整個訂單處理模塊的影響,加快開發的速度,及產生BUG的幾率。
3. 管道模式
3.1 名稱解釋:(閥門也可以理解為過濾器)
管道負責數據的傳遞,它把原始數據傳遞給第一個閥門,加工處理後將第一個閥門的輸出傳遞給下一個閥門,當做下一個閥門的輸入,重複這個過程直到處理結束。
閥門負責數據的處理,閥門可以有多個,每個閥門對數據做特定的處理,他們之間沒有沒有依賴關係,這種松耦合的設計,使得每個閥門只需要實現單一功能,從而降低了系統的複雜度,從而可以通過更加靈活的組合實現新的功能。
3.2 管道模式的實現:
為了使用方便,將管道模式的實現代碼封裝成了一個工具類放在了util中。
該工具類包括NormalValve.java ,Validator.java ,BusinessProcessor.java ,PipeLine.java 4個接口,以及ValidatorSet.java ,NormalPipeLine.java ,BusinerssProcessorSet.java ,FlowResult.java ,PipeContext.java 5個文件。
NormalValve.java : 定義閥門基礎接口,閥門都需實現該接口或者該接口的擴展接口
Validator.java : NormalValue的擴展接口,一般數據的驗證需實現該接口。
BusinessProcessor.java :NormalValve的擴展接口,一般業務處理實現該接口。
FlowResult .java: 封裝返回值的實體類
PipeLineContext.java : 封裝上下文參數實體類
PipeLine.java : 定義管道接口,包括添加閥門方法以及開啟管道方法
NormalPipeLine.java : 實現PipeLine 接口
ValidatorSet.java : NormalPipeLine擴展類,用於驗證管道
BusinessProcessorSet.java : NormalPipeLine擴展類,用於業務管道
4.重構後訂單業務處理管道模式使用示例
4.1 目前訂單業務處理邏輯示意圖
模型圖:
![代碼優化之管道模式](http://p2.ttnews.xyz/loading.gif)
類圖:
![代碼優化之管道模式](http://p2.ttnews.xyz/loading.gif)
流程圖:
4.2 如何添加新的訂單驗證邏輯
主模塊中創建訂單驗證器集合
下單數據驗證管道
//如果訂單的處理過程中需要傳遞除已固定參數外的上下文參數,可以使用PipeLineContext傳遞,PipeLineContext是一個Map形式數據
PipeLineContext context = new PipeLineContext(); //context作為下單管道中的上下文參數傳遞
context.put("responseMap", responseMap);
ValidatorSet validatorSet = new ValidatorSet(); //初始化驗證集合
//添加驗證器
validatorSet.addValidator(orderParamValidator);
validatorSet.addValidator(orderStoreValidator);
validatorSet.addValidator(orderAddressValidator);
validatorSet.addValidator(orderPhoneValidator);
validatorSet.addValidator(orderCountValidator);
//執行下單的驗證邏輯,按照添加驗證器的順序進行驗證
FlowResult flowResult = validatorSet.validate(context, orderVo);
//判斷驗證結果,isStatus為false,驗證失敗,返回失敗信息,isStatus為true,驗證成功,接著往下走
if (!flowResult.isStatus()) {
return (ReturnValue) flowResult.getMessage();
}
注:在添加新的訂單驗證邏輯的時候只需新建一個java類,實現Validator接口,並將其添加到管道中即可。類名應以Validator結尾(xxxValidator)。
訂單驗證邏輯閥門示例demo
Expand source
4.3 如何添加訂單業務處理邏輯
主模塊中創建訂單業務處理邏輯
創建訂單業務處理管道
//初始化訂單業務集合
BusinessProcessorSet businessProcessorSet = new BusinessProcessorSet();
//添加業務處理器
businessProcessorSet.addBusinessProcessor(orderDeliverTimeAndPriceProcessor);
businessProcessorSet.addBusinessProcessor(orderItemAndPriceProcessor);
businessProcessorSet.addBusinessProcessor(orderSampleActivityProcessor);
businessProcessorSet.addBusinessProcessor(orderBonusProcessor);
businessProcessorSet.addBusinessProcessor(orderPackageProcessor);
businessProcessorSet.addBusinessProcessor(orderPayMethodProcessor);
businessProcessorSet.addBusinessProcessor(orderInsertProcessor);
businessProcessorSet.addBusinessProcessor(orderAfterInsertProcessor);
//執行業務處理邏輯,按照添加的先後順序進行執行
FlowResult businessResult = businessProcessorSet.process(context, orderVo);
//判斷驗證結果,isStatus為false,驗證失敗,返回失敗信息,isStatus為true,驗證成功,接著往下走
if (!businessResult.isStatus()) {
return (ReturnValue) businessResult.getMessage();
}
注:新增業務可以新建一個業務處理類,實現BusinessProcessor接口,再將該類添加到訂單業務管道中,命名應以Processor結尾(xxxProcessor)
閱讀更多 Hello123world 的文章