業務場景:設備和客戶端按照通訊協議進行通信,設備會有大量的消息送到到客戶端,然后客戶端收到消息並進行解析,根據不同的消息類型進行區分處理。
如果不考慮設計模式,不考慮易擴展性和易維護性,通常我們的代碼會是如下情況:
/// <summary> /// 設備消息送到解析 /// </summary> /// <param name="MsgType"></param> private void ExplainData(ushort MsgType) { switch (MsgType) { case (ushort)EMMsgType.LogSerialNumSever: //登錄序號 //處理當前的業務 break; case (ushort)EMMsgType.LogResultServer: //登錄結果 //處理這里的業務 break; case (ushort)EMMsgType.ResultPhoneCallMoney://電召費用查詢結果返回 if (條件1) { //處理這里的業務 } else { //處理這里的業務 } if (條件2) { //又處理其他情況 } else { //處理這里的業務 } break; } }
如果協議中的設備消息有100種,那我們自然就當前switch里面會包含100個case,每個case之間又會還有相關的業務代碼。
真實代碼片段是這樣的
這個switch里面包含了522行代碼,如果需要修改或增加新的業務功能,需要在522行代碼里面小心的增加已避免對其他case里的代碼造成影響。其維護難度太大了。
如何考慮代碼優化
客戶端接收到消息-》處理消息。我們增加一個消息處理接口類。
public interface BaseExplainData { /// <summary> /// 數據解析 /// </summary> /// <param name="msgData"></param> void ExplainData(); }
增加實現了消息處理基類的具體實現類
public class 設置終端參數處理類:BaseExplainData { public void ExplainData() { Console.WriteLine("這里是設置終端參數處理類"); //其他處理 } } public class 平台返回心跳處理類 : BaseExplainData { public void ExplainData() { Console.WriteLine("這里是平台返回心跳處理類"); //其他處理 } } public class 客服端心跳包處理類 : BaseExplainData { public void ExplainData() { Console.WriteLine("這里是客服端心跳包處理類"); //其他處理 } } public class 終端通用應答處理類 : BaseExplainData { public void ExplainData() { Console.WriteLine("這里是終端通用應答處理類"); //其他處理 } }
增加個字典(字典由於有key,所以是高效查找),key是消息類型,對應的保存的是該消息的實例化的消息處理類。
public Dictionary<EMMsgType, BaseExplainData> dicExplainReceiveData = new Dictionary<EMMsgType, BaseExplainData> { {EMMsgType.終端通用應答,new 終端通用應答處理類()}, {EMMsgType.客服端心跳包,new 客服端心跳包處理類()}, {EMMsgType.平台返回心跳,new 平台返回心跳處理類()}, {EMMsgType.設置終端參數,new 設置終端參數處理類()}, //如果以后有增加其他消息處理,就在后面追加 };
如果后續又增加了其他的消息協議,因為字典里的對象是平行關系,只需要在字典里追加。簡單直接。
最后的處理代碼,設備消息過來,根據消息類型從字典里取出實例化的對象,調用ExplainData處理。
1 /// <summary> 2 /// 設備消息送到解析 3 /// </summary> 4 /// <param name="MsgType"></param> 5 private void ExplainData(EMMsgType MsgType) 6 { 7 var rst=dicExplainReceiveData[MsgType]; 8 if (rst!=null) 9 { 10 rst.ExplainData(); 11 } 12 }
如果后續又增加了其他的消息協議,這里完全不用修改。
代碼簡潔清晰,再也不用看switch..case...case...case...^0^
~結束