1. 程式人生 > >使用工廠模式和策略模式重構複雜業務邏輯

使用工廠模式和策略模式重構複雜業務邏輯

專案組在和外部系統對接,花了好長一段時間對以前的列印邏輯做修改,修改了8次的bug,才實現了當前的外接系統的列印功能,上線的前一刻又發現此次的改動對以前的邏輯產生關聯影響,哎,不談了,原因很簡單,隨著外接系統的增多,實現的列印方式和功能已經很多了,而此時幾千行的程式碼看看已經讓人崩潰了,改動的難度就更大了。
不得不重構了,梳理業務和程式碼邏輯後,決定採用工廠+策略的模式進行重構。
工廠模式主要是為建立物件提供過渡介面,以便將建立物件的具體過程遮蔽隔離起來。

簡單工廠實現客戶買寶馬的例子:


  1. class Factory {  
  2.     staticfunction  createBMW(type
    ){  
  3.         switch (type) {  
  4.           case 320:  
  5.              returnnew BWM320();  
  6.           case 523:  
  7.              returnnew BMW523();  
  8.    }  
工廠實現客戶買寶馬車的例子:
  1. /** 
  2.  * 建立工廠的介面 
  3.  * 
  4.  */
  5. interface FactoryBMW {   
  6.        function createBMW();   
  7. }   
  8. /** 
  9.  *  
  10.  * 建立BWM320車 
  11.  */
  12. class FactoryBWM320 
    implements FactoryBMW {  
  13.    function  createBMW($type){  
  14.       returnnew BWM320();  
  15.    }  
  16. }  
  17. /** 
  18.  *  
  19.  * 建立BWM523車 
  20.  */
  21. class FactoryBWM523 implements FactoryBMW {  
  22.    function  createBMW($type){  
  23.       returnnew BMW523();  
  24.    }  

抽象工廠的例子:
抽象工廠模式的用意為:給客戶端提供一個介面,可以建立多個產品族中的產品物件 ,而且使用抽象工廠模式還要滿足一下條件:
     1)系統中有多個產品族,而系統一次只可能消費其中一族產品。 
     2)同屬於同一個產品族的產品以其使用。 
抽象工廠模式的各個角色(和工廠方法一樣): 
     1)抽象工廠角色: 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。在java中它由抽象類或者介面來實現。 
     2)具體工廠角色:它含有和具體業務邏輯有關的程式碼。由應用程式呼叫以建立對應的具體產品的物件。
     3)抽象產品角色:它是具體產品繼承的父類或者是實現的介面。
     4)具體產品角色:具體工廠角色所建立的物件就是此角色的例項。

策略模式:定義了不同的演算法族,並且之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。

Context(應用場景):

l         需要使用ConcreteStrategy提供的演算法。

l         內部維護一個Strategy的例項。

l         負責動態設定執行時Strategy具體的實現演算法。

l         負責跟Strategy之間的互動和資料傳遞。

Strategy(抽象策略類):

l         定義了一個公共介面,各種不同的演算法以不同的方式實現這個介面,Context使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現。

ConcreteStrategy(具體策略類):

l         實現了Strategy定義的介面,提供具體的演算法實現。


有了上面的知識,重構就理順了。外部關聯絡統部需要知道我怎麼實現列印的,只需要告訴我列印需要的內容和印表機就好了。

關聯絡統A需要列印a,b,c三種類型的材料,並且採用彩色列印和黑白列印兩種方式混合的方式。

在我們系統中,目前支援單頁彩打,單頁黑白列印,多頁彩打,多頁雙面彩打,多頁雙面黑白打,以及以上的方式是否需要蓋章,是否需要防偽水印,是否需要電子簽名等多種方式的列印。講以上的列印功能分成列印策略及子類,蓋章策略及子類,防偽策略及子類三個策略類。

採用抽象工廠的方式,根據A系統的要求,在抽象工廠中生成適合的工廠類,呼叫合適的策略類就搞定了,再增加關聯絡統的時候,只需要再增加策略方法就搞定了。

重構前,原來的多個外部關聯絡統的N種列印邏輯程式碼有近4000行,重構後用1000多行程式碼完成整個流程,簡單明瞭,呵呵。