学习设计模式已经已经有一段时间了,一直没机会再实践中应用,没想到第一次成功使用设计模式的思想会是在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小时 :)
该程序虽然简单,但是充分体现出了设计模式中思想的重要性,如果不是第一时间的想到设计模式中模式,很可能需要修改原函数本身,这样肯定需要先了解原函数中程序的运行机制,增加了时间,并且不知道整个程序中是否还有其他位置调用到了这些函数,因此可能会引入意想不到的错误。采用设计模式思想,很轻松的解决了上述问题,高质量的完成了工作。