设计总结2,关于template method 或者algorithm skeleton的一个应用
2006-12-03 15:05
375 查看
在程序中,经常发现这样的重复代码,就是需要打开文件然后循环读取文件的每一行进行相关超做,我们知道重复代码就是bad smell的一种。
那么如何复用这个部分呢?换句话说,是否可以在应用的角度上完全不需要考虑文件读写的过程呢,我们把文件文件读的代码抽象出来,让子类实现do_after_read_line接口来做实际的读写后的处理,这样实现了重用。
代码如下
#ifndef FILE_READER
#define FILE_READER
#include <iostream>
#include <fstream>
#include "assert.h"
namespace utility
{
class file_reader
{
protected:
//子类可以不实现
virtual void before_read()
{}
//子类可以不实现
virtual void after_read()
{}
//子类必须实现
virtual void do_after_read_line(char * line_buffer)=0;
void read_file(const char* p_file)
{
assert( NULL != p_file );
FILE *fp ;
before_read();
fp = fopen(p_file, "r");
if( NULL == fp )
{
WEBSEARCH_ERROR((LM_TRACE,"%s is cannot be opened./n",p_file ));
return;
}
char line_buffer[1024];
memset(line_buffer,0x0,1024);
while( fgets(line_buffer, 1024, fp) )
{
do_after_read_line(line_buffer);
memset(line_buffer,0x0,1024);
}
fclose(fp);
after_read();
return ;
}
};
}
#endif
那么如何复用这个部分呢?换句话说,是否可以在应用的角度上完全不需要考虑文件读写的过程呢,我们把文件文件读的代码抽象出来,让子类实现do_after_read_line接口来做实际的读写后的处理,这样实现了重用。
代码如下
#ifndef FILE_READER
#define FILE_READER
#include <iostream>
#include <fstream>
#include "assert.h"
namespace utility
{
class file_reader
{
protected:
//子类可以不实现
virtual void before_read()
{}
//子类可以不实现
virtual void after_read()
{}
//子类必须实现
virtual void do_after_read_line(char * line_buffer)=0;
void read_file(const char* p_file)
{
assert( NULL != p_file );
FILE *fp ;
before_read();
fp = fopen(p_file, "r");
if( NULL == fp )
{
WEBSEARCH_ERROR((LM_TRACE,"%s is cannot be opened./n",p_file ));
return;
}
char line_buffer[1024];
memset(line_buffer,0x0,1024);
while( fgets(line_buffer, 1024, fp) )
{
do_after_read_line(line_buffer);
memset(line_buffer,0x0,1024);
}
fclose(fp);
after_read();
return ;
}
};
}
#endif
相关文章推荐
- WINCE应用层设计经验总结-关于TCPMP播放器制作编译篇
- OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R
- WINCE应用层设计经验总结-关于当前时间显示和当前时间获取
- WINCE应用层设计经验总结-关于INI文件读写的类
- 关于java中static关键字在单态设计模式的应用学习和总结
- WINCE应用层设计经验总结-关于用串口发AT命令给蓝牙
- 小编推荐:关于移动应用的新手引导设计
- 关于servlet的一个简单应用
- 微信小程序开发关于分享功能中怎么定义同一个页面中不同的按钮触发不同的分享内容,或者右上角的分享和页面中分享
- 《Scrum实战》读书会作业01 - 用知行视角总结现在或者过去的一个项目
- [设计模式]模板方法模式(Template Method)---抽象类的常见应用
- 关于app集成支付宝应用内支付的问题总结
- 一个初学者关于vr游戏开发的优化总结
- 关于HBase MVCC的设计原理以及MVCC所引起的一个scan问题
- 设计一个移动应用的本地缓存机制
- ROS探索总结(十六)(十七)(十八)(十九)——HRMRP机器人的设计 构建完整的机器人应用系统 重读tf 如何配置机器人的导航功能
- 一个关于时间的静态变量的应用
- 关于字符编码、对象传递、文件传递、字符串传递、 TcpClient、TcpListener的又一个应用
- 一个服务器搭多个tomcat导致session丢失,或者同一个IP不同端口,多个应用的session会冲突解决方法
- 关于KVM网卡设置的一个总结