1.業務場景 生產車間中使用的條碼掃描,往往一把掃描槍需要掃描不同的條碼來處理不同的業務邏輯,比如,掃描投入料工位條碼、掃描投入料條碼、掃描產出工裝條碼等,每種類型的條碼位數是不一樣,因此通過條碼長度來進行業務區分。 2.初步設計 面對此場景,能夠想到的最簡單的設計就是使用if...else if. ...
1.業務場景
生產車間中使用的條碼掃描,往往一把掃描槍需要掃描不同的條碼來處理不同的業務邏輯,比如,掃描投入料工位條碼、掃描投入料條碼、掃描產出工裝條碼等,每種類型的條碼位數是不一樣,因此通過條碼長度來進行業務區分。
2.初步設計
面對此場景,能夠想到的最簡單的設計就是使用if...else if...或者swith進行判斷,因此,我們編寫的代碼如下
1 switch(barCode.length) 2 { 3 case 3: 4 DoSomething1(); 5 break; 6 case 4: 7 DoSomething2(); 8 break; 9 case 5: 10 DoSomething3(); 11 break; 12 default: 13 DoSomething4(); 14 break; 15 }
使用是if...else if...或者switch已經基本上滿足了需求,以後需要添加掃描場景,只需要增加判斷,完成對應的方法即可。
作為一個程式員,僅僅滿足需求的話,往往降低了對自己的要求,同時,隨著掃描業務的增加,switch中的代碼逐漸增加,多到我們自己都覺得這段代碼讀起來就像是吃著前天剩下的硬饅頭一樣,難以下咽。
3.設計提升
上述場景完全可以使用設計模式中的責任鏈模式來進行優化,實施步驟如下:
3.1 定義處理結果
一個處理在責任鏈上流動時,有兩種結果,一是不能處理,轉給其後繼者,二是可以處理,同時又引出兩種結果,處理成功和處理失敗。因此,對處理結果統一定義為枚舉類型
1 public enum HandleResult 2 { 3 /// <summary> 4 /// 成功 5 /// </summary> 6 Success=0, 7 /// <summary> 8 /// 失敗 9 /// </summary> 10 Failed = 1, 11 /// <summary> 12 /// 未處理 13 /// </summary> 14 Unhandle = 2 15 }
3.2定義業務抽象類AbstractBarCodeHandler
定義業務抽象類,包含一個屬性“Successor”,用於標記其後繼者,一個公共方法“HandleRequest”,當調用真正的業務處理方法時返回未處理,則調用其後繼者進行處理,一個抽象方法“HandleRequestCore”,每個掃描業務具體類,需要實現此方法,並對條碼進行處理。
1 public abstract class AbstractBarCodeHandler 2 { 3 /// <summary> 4 /// 責任處理的後繼者 5 /// </summary> 6 private AbstractBarCodeHandler mSuccessor; 7 8 /// <summary> 9 /// 責任處理的後繼者 10 /// </summary> 11 public AbstractBarCodeHandler Successor 12 { 13 get 14 { 15 return mSuccessor; 16 } 17 18 set 19 { 20 mSuccessor = value; 21 } 22 } 23 24 /// <summary> 25 /// 請求處理方法 26 /// </summary> 27 public HandleResult HandleRequest(string barCode) 28 { 29 var result = HandleRequestCore(barCode); 30 if (result == HandleResult.Unhandle) 31 { 32 if (Successor != null) 33 { 34 Successor.HandleRequest(barCode); 35 } 36 else 37 { 38 Console.WriteLine($"The BarCode:{barCode} do not handle."); 39 } 40 } 41 return result; 42 } 43 44 protected abstract HandleResult HandleRequestCore(string barCode); 45 }
3.3定義業務實現具體類
每個具體的條碼掃描業務,都定義一個類,繼承自AbstractBarCodeHandler,並實現其抽象方法,比如,
LocationBarCodeHandler:工位條碼處理類
LocationInBarCodeHandler:入庫條碼處理類
LocationOutBarCodeHandler:出庫條碼處理類
MaterialBarCodeHandler:物料條碼處理類
ToolingBarCodeHandler:工裝條碼處理類
3.4 生成責任鏈
依次對每個類進行初始化,並設置其後繼者,比如:
工位條碼處理類實例.Successor=入庫條碼處理類實例;
入庫條碼處理類實例.Successor=出庫條碼處理類實例;
出庫條碼處理類實例.Successor=物料條碼處理類實例;
物料條碼處理類實例.Successor=工裝條碼處理類實例;
3.5處理過程
當條碼槍掃描一個條碼,便發起了一個處理請求,該請求在責任鏈上依次流動(工位->入庫->出庫->物料->工裝),若某個節點不能夠處理,則需要交接去後繼者,若能夠處理,則返回處理結果,當所有的節點都無法處理,需要給出對應的提示。
二〇一八年四月一日