业务场景:设备和客户端按照通讯协议进行通信,设备会有大量的消息送到到客户端,然后客户端收到消息并进行解析,根据不同的消息类型进行区分处理。
如果不考虑设计模式,不考虑易扩展性和易维护性,通常我们的代码会是如下情况:
/// <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^
~结束