装饰模式在Intermec CK1应用程序中通讯模块的应用
学习设计模式已经已经有一段时间了,一直没机会再实践中应用,没想到第一次成功使用设计模式的思想会是在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应用程序中通讯模块的应用相关推荐
- 微信小程序中的tabBar设置
我们先来看一份图,这个设置在官方文档中已经写得很清楚了,我只是做一个总结 注:我写注释是为了方便说明,在小程序中的json文件中是不能用注释的 这个tabBar属于全局属性,因此就在全局配置文件app ...
- C#中Winform程序中如何实现多维表头【不通过第三方报表程序】
问题:C#中Winform程序中如何实现多维表头. 在网上搜了很多方法,大多数方法对于我这种新手,看的都不是很懂.最后在新浪博客看到了一篇比较易懂的文章:[DataGridView二维表头与合并单元格 ...
- 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...
- 在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统
在<在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎>开始处,我提到某公司被指责使用"云命令"暗杀一些软件.本文将讲述如何去模拟一个 ...
- 在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎
前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件.同事完成这个逻辑的方案便是在我们程序中加入了一个很"独立"的业务逻辑:检索和删除某个程序产生的废弃文件.试想, ...
- 在vc6控制台程序中如何调用运行ImageMagick命令行工具
在http://www.imagemagick.org/script/index.php网站下载相应的执行文件,这里以下载ImageMagick-6.6.5-10-Q16-windows-static ...
- spark 获取广播变量_Spark流式程序中广播变量和累加器为何使用单例模式
Spark中广播变量详解以及如何动态更新广播变量mp.weixin.qq.com 1.广播变量是只读的,使用单例模式可以减少Spark流式程序中每次job生成执行,频繁创建广播变量带来的开销 2. ...
- 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...
关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...
- python缩进在程序中长度统一且强制使用_Python习题纠错1
February, 1991 0.9.1 2.Python语言的缩进只要统一即可,不一定是4个空格(尽管这是惯例). Python缩进在程序中长度统一且强制使用. 3.IPO:Input Proces ...
最新文章
- 关于ARM启动的一篇文章
- MySql 基于C_API的数据库封装
- mysql sql语句最大长度设置方法
- ubuntu共享无线链接
- java is alphabetic_JDK之Pattern类探索(一)
- 11个常用的SQL技巧
- IT信息业、金融业从业人员悲歌
- ES6学习笔记一:let、const、块级作用域
- STM32 SPI 读取12位RM08 SSI 编码器信号
- uiautomator2遍历子元素
- Python-玩转数据-利用百度高德经纬度地图定位
- Windows注册表的基本知识及应用
- 从零开始的Linux 阿里云ECS服务器搭建、FileZilla和宝塔
- 【C#】使用COM组件操作Excel
- 事务transactional详解
- Android知识导图
- 港中文计算机金融,香港中文大学金融数据分析和风险管理科学硕士专业
- 鼠标滑动两张图片前后对比js插件
- 今日学习感悟(Java)
- 什么是中间件?如何设计一个中间件?
热门文章
- leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)
- 图像分割-LOG检测器和DOG检测器
- doublevalue_Java Double类doubleValue()方法与示例
- C---编写程序:实现一个随堂测试,能进行加减乘除运算。要求如下:(1)随机产生两个1~10的正整数,在屏幕上输出题目,如:5+3=?(2)学生输入答案,程序检查学生输入答案是否正确,若正确,
- axure源文件_Axure教程:实现网易云音乐有声播放效果
- ps命令与top命令参数意义详解
- 二叉树题目---3 另一个树的子树 AND 二叉树最大深度
- 每日一题:leetcode191.位1的个数
- 【数据结构】对快速排序原理的理解(图解,通俗易懂)
- IDEA快速修改类名和文件名