装饰器模式
一、基类

/*---------------------------------------------------------------- * 作 者 :姜 彦 * 项目名称 :Decorator * 类 名 称 :FrameModel * 命名空间 :Decorator * CLR 版本 :4.0.30319.42000 * 创建时间 :2019/2/21 12:55:04 * 当前版本 :1.0.0.1 * My Email :jiangyan2008.521@gmail.com * jiangyan2008.521@qq.com * 描述说明: 装饰器原始积累 * * 修改历史: * ******************************************************************* * Copyright @ JiangYan 2019. All rights reserved. ******************************************************************* ------------------------------------------------------------------*/ using System; using System.Collections.Generic; namespace Decorator { /// <summary> /// FrameModel /// </summary> public abstract class FrameModel { #region 帧基本结构 /// <summary> /// 帧头 /// </summary> public static readonly byte FrameBegin = 0xFA; /// <summary> /// 命令ID /// </summary> public CommandID CmdID; /// <summary> /// 帧号 2 BYTES - (0 ~ 0xFEFE) /// </summary> public ushort iSeqNo; /// <summary> /// 是否需要应答 /// 00:不需要 or 上报帧 /// 01:需要 /// 02:应答帧 /// </summary> public byte IsReply; /// <summary> /// 命令的数据内容 /// </summary> public byte[] CmdData; /// <summary> /// 校验码 /// </summary> public byte LRC { get; set; } /// <summary> /// 帧尾 /// </summary> public static readonly byte FrameEnd = 0xFB; #endregion #region 帧其他属性 /// <summary> /// 该包的存活时间 /// </summary> public DateTime iLiveTime; /// <summary> /// 是否立即发送 /// </summary> public bool Immediate; public static bool IsEncode { get; set; } public static bool IsBigEndian = true; public int IConSendCnt { get; set; } #endregion #region 帧其他方法 /// <summary> /// 计算LRC校验值 /// </summary> /// <param name="datas"></param> /// <returns></returns> public static byte GetLRC(List<byte> datas) { byte Cs; Cs = 0; foreach (byte data in datas) Cs = (byte)(Cs + data); uint sub = 256 - (uint)Cs; Cs = (byte)sub; switch (IsEncode) { case false: byte[] ds; //ds = DataConverter.ToBytes(Cs); //Cs = ds[0]; break; default: break; } return Cs; } #endregion #region 抽象方法 /// <summary> /// 将通信帧转化为byte[] /// </summary> /// <returns></returns> public abstract byte[] ToByte(); /// <summary> /// 将通信帧转为字符串类型 /// </summary> /// <returns></returns> public abstract override string ToString(); #endregion } public enum CommandID { MSG_Connect, } } /*---------------------------------------------------------------- * 备 注 : * * * ******************************************************************* * Copyright @ JiangYan 2019. All rights reserved. ******************************************************************* ------------------------------------------------------------------*/
二、装饰器

/*---------------------------------------------------------------- * 作 者 :姜 彦 * 项目名称 :Decorator * 类 名 称 :FrameModelDecodeDecorator * 命名空间 :Decorator * CLR 版本 :4.0.30319.42000 * 创建时间 :2019/2/21 12:57:26 * 当前版本 :1.0.0.1 * My Email :jiangyan2008.521@gmail.com * jiangyan2008.521@qq.com * 描述说明: 基类FrameModel的装饰器 * * 修改历史: * ******************************************************************* * Copyright @ JiangYan 2019. All rights reserved. ******************************************************************* ------------------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Decorator { /// <summary> /// FrameModelDecodeDecorator /// </summary> public class FrameModelDecodeDecorator:FrameModel { #region Construction public FrameModelDecodeDecorator() { } public FrameModelDecodeDecorator(FrameModel frameModel) { _FrameModel = frameModel; } #endregion #region Property #region Global Variable private FrameModel _FrameModel = null; #endregion #endregion #region Decorator of abstruct fuctions public override byte[] ToByte() { List<byte> packet = new List<byte>(); byte[] ccmd = BitConverter.GetBytes((ushort)_FrameModel.CmdID); byte[] iSeqNo = BitConverter.GetBytes(_FrameModel.iSeqNo); packet.Add(FrameBegin); packet.Add(ccmd[1]); packet.Add(ccmd[0]); packet.Add(iSeqNo[1]); packet.Add(iSeqNo[0]); packet.Add(_FrameModel.IsReply); for (int i = 0; i < _FrameModel.CmdData.Length; i++) { packet.Add(_FrameModel.CmdData[i]); } byte Cs = GetLRC(packet.Skip(1).Take(packet.Count - 1).ToList()); packet.Add(Cs); packet.Add(FrameEnd); return packet.ToArray(); } public override string ToString() { List<byte> packet = new List<byte>(); byte[] ccmd = BitConverter.GetBytes((ushort)_FrameModel.CmdID); byte[] iSeqNo = BitConverter.GetBytes((ushort)_FrameModel.iSeqNo); packet.Add(FrameBegin); packet.Add(ccmd[1]);//F0 packet.Add(ccmd[0]);//30 packet.Add(iSeqNo[1]);//01 packet.Add(iSeqNo[0]);//00 packet.Add(_FrameModel.IsReply); for (int i = 0; i < _FrameModel.CmdData.Length; i++) { packet.Add(_FrameModel.CmdData[i]); } byte Cs = GetLRC(packet.Skip(1).Take(packet.Count - 1).ToList()); packet.Add(Cs); packet.Add(FrameEnd); StringBuilder recBuffer16 = new StringBuilder(); string sendStr = string.Empty; byte[] sendBytes = packet.ToArray(); for (int i = 0; i < sendBytes.Length; i++) { recBuffer16.AppendFormat("{0:X2}" + " ", sendBytes[i]); } sendStr = recBuffer16.ToString(); return sendStr; } #endregion } } /*---------------------------------------------------------------- * 备 注 : * * * ******************************************************************* * Copyright @ JiangYan 2019. All rights reserved. ******************************************************************* ------------------------------------------------------------------*/

您的资助是我最大的动力!
金额随意,欢迎来赏!

我写的东西能让你能懂,那是义务
毕竟占用了你生命中的宝贵的时间和注意力
要是你还能喜欢我的作品,那就是缘分了
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【青青子衿】!