学习设计模式已经已经有一段时间了,一直没机会再实践中应用,没想到第一次成功使用设计模式的思想会是在SD结构的程序中。

这次分配下来一个比较急的任务,要求在原有通讯模块的基础上添加发送头包的功能,由于对原来程序通讯机制不是很了解,并且时间确实比较紧,因此没法重写这部分函数。研究了一下通讯模块中从文件中建立数据包的部分,发现程序中没有单独封包的函数,而是直接根据输入不同的包编号从文件直接定位该包的位置,读取256个字节,返回数据包中数据内容。这样若想添加的新数据包不再文件当中,就必须更改原来的函数才能实现。

原函数如下:

void xs_get_data_package(LONG i_package_sn,  CHAR** ppc_data,  FILE* pf_upload_data_file)

{

根据传输的i_package_sn不同,从文件 pf_upload_data_file中建立数据包,由ppc_data返回数据包

}

对该函数进行分析,发现实际上我要加入头包,同时也需要从文件中获得的数据包,并且头包对从文件中的得到数据包来说没有影响。因此考虑是否可以增加一个装饰函数,在原有函数功能的基础上增加新的功能我所需要的添加头包的功能。装饰适配器函数的原形如下:

void adpter_xs_get_data_package(LONG i_package_sn,  CHAR** ppc_data,  FILE* pf_upload_data_file,CHAR**head_packet)

{    //head_packet为头包中的数据

if (i_package_sn==0)
                {
                      根据head_packet组装头包
                      return HR_OK;
                }
                hr=xs_get_package_from_file(i_package_sn-1,ppc_data, pf_upload_data_file);
                return hr;

}

计算文件中总包数的函数

int xs_get_data_package_count(char *package_sn,char *fp_upload_data_file);

该函数根据文件的不同计算包的总数,由于增加了头包,因此包总数需要+1,装饰适配器函数如下:

int adpter_xs_get_data_package_count(char *package_sn,char *fp_upload_data_file)

{

return xs_get_data_package_count(char *package_sn,char *fp_upload_data_file)+1;

}

本来需要从写数据包分配和相应的通讯部分函数的问题迎刃而解,算上测试总共花了不到3小时 :)

该程序虽然简单,但是充分体现出了设计模式中思想的重要性,如果不是第一时间的想到设计模式中模式,很可能需要修改原函数本身,这样肯定需要先了解原函数中程序的运行机制,增加了时间,并且不知道整个程序中是否还有其他位置调用到了这些函数,因此可能会引入意想不到的错误。采用设计模式思想,很轻松的解决了上述问题,高质量的完成了工作。

转载于:https://www.cnblogs.com/wude/archive/2007/06/29/1941647.html

装饰模式在Intermec CK1应用程序中通讯模块的应用相关推荐

  1. 微信小程序中的tabBar设置

    我们先来看一份图,这个设置在官方文档中已经写得很清楚了,我只是做一个总结 注:我写注释是为了方便说明,在小程序中的json文件中是不能用注释的 这个tabBar属于全局属性,因此就在全局配置文件app ...

  2. C#中Winform程序中如何实现多维表头【不通过第三方报表程序】

    问题:C#中Winform程序中如何实现多维表头. 在网上搜了很多方法,大多数方法对于我这种新手,看的都不是很懂.最后在新浪博客看到了一篇比较易懂的文章:[DataGridView二维表头与合并单元格 ...

  3. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库

    在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...

  4. 在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统

    在<在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎>开始处,我提到某公司被指责使用"云命令"暗杀一些软件.本文将讲述如何去模拟一个 ...

  5. 在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎

    前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件.同事完成这个逻辑的方案便是在我们程序中加入了一个很"独立"的业务逻辑:检索和删除某个程序产生的废弃文件.试想, ...

  6. 在vc6控制台程序中如何调用运行ImageMagick命令行工具

    在http://www.imagemagick.org/script/index.php网站下载相应的执行文件,这里以下载ImageMagick-6.6.5-10-Q16-windows-static ...

  7. spark 获取广播变量_Spark流式程序中广播变量和累加器为何使用单例模式

    Spark中广播变量详解以及如何动态更新广播变量​mp.weixin.qq.com 1.广播变量是只读的,使用单例模式可以减少Spark流式程序中每次job生成执行,频繁创建广播变量带来的开销 2. ...

  8. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  9. python缩进在程序中长度统一且强制使用_Python习题纠错1

    February, 1991 0.9.1 2.Python语言的缩进只要统一即可,不一定是4个空格(尽管这是惯例). Python缩进在程序中长度统一且强制使用. 3.IPO:Input Proces ...

最新文章

  1. 关于ARM启动的一篇文章
  2. MySql 基于C_API的数据库封装
  3. mysql sql语句最大长度设置方法
  4. ubuntu共享无线链接
  5. java is alphabetic_JDK之Pattern类探索(一)
  6. 11个常用的SQL技巧
  7. IT信息业、金融业从业人员悲歌
  8. ES6学习笔记一:let、const、块级作用域
  9. STM32 SPI 读取12位RM08 SSI 编码器信号
  10. uiautomator2遍历子元素
  11. Python-玩转数据-利用百度高德经纬度地图定位
  12. Windows注册表的基本知识及应用
  13. 从零开始的Linux 阿里云ECS服务器搭建、FileZilla和宝塔
  14. 【C#】使用COM组件操作Excel
  15. 事务transactional详解
  16. Android知识导图
  17. 港中文计算机金融,香港中文大学金融数据分析和风险管理科学硕士专业
  18. 鼠标滑动两张图片前后对比js插件
  19. 今日学习感悟(Java)
  20. 什么是中间件?如何设计一个中间件?

热门文章

  1. leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)
  2. 图像分割-LOG检测器和DOG检测器
  3. doublevalue_Java Double类doubleValue()方法与示例
  4. C---编写程序:实现一个随堂测试,能进行加减乘除运算。要求如下:(1)随机产生两个1~10的正整数,在屏幕上输出题目,如:5+3=?(2)学生输入答案,程序检查学生输入答案是否正确,若正确,
  5. axure源文件_Axure教程:实现网易云音乐有声播放效果
  6. ps命令与top命令参数意义详解
  7. 二叉树题目---3 另一个树的子树 AND 二叉树最大深度
  8. 每日一题:leetcode191.位1的个数
  9. 【数据结构】对快速排序原理的理解(图解,通俗易懂)
  10. IDEA快速修改类名和文件名