不迎不送,来去自便,无茶无酒,谈笑随缘

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
 

        学习设计模式已经已经有一段时间了,一直没机会再实践中应用,没想到第一次成功使用设计模式的思想会是在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小时 :)

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

posted on 2007-06-29 21:40  wude  阅读(165)  评论(0编辑  收藏  举报