代碼優化之管道模式

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 目前訂單業務處理邏輯示意圖

模型圖:

代碼優化之管道模式

類圖:

代碼優化之管道模式

流程圖:

代碼優化之管道模式

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)


分享到:


相關文章: