装饰器模式

一、基类

/*----------------------------------------------------------------
 * 作    者 :姜  彦 
 * 项目名称 :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.
*******************************************************************
------------------------------------------------------------------*/
装饰器

 

posted @ 2019-02-21 15:39  <--青青子衿-->  阅读(84)  评论(0)    收藏  举报
// /**/ // 在页脚Html代码 引入 // function btn_donateClick() { var DivPopup = document.getElementById('Div_popup'); var DivMasklayer = document.getElementById('div_masklayer'); DivMasklayer.style.display = 'block'; DivPopup.style.display = 'block'; var h = Div_popup.clientHeight; with (Div_popup.style) { marginTop = -h / 2 + 'px'; } } function MasklayerClick() { var masklayer = document.getElementById('div_masklayer'); var divImg = document.getElementById("Div_popup"); masklayer.style.display = "none"; divImg.style.display = "none"; } setTimeout( function () { document.getElementById('div_masklayer').onclick = MasklayerClick; document.getElementById('btn_donate').onclick = btn_donateClick; var a_gzw = document.getElementById("guanzhuwo"); a_gzw.href = "javascript:void(0);"; $("#guanzhuwo").attr("onclick","follow('33513f9f-ba13-e011-ac81-842b2b196315');"); }, 900);