模板方法模式之二

range.h

#ifndef _RANGE_H_
#define _RANGE_H_
#ifdef __cplusplus
extern "C" {
#endif
int range(const char *pFname);
#ifdef __cplusplus
}
#endif
#endif
 
range.c
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include "file_reader.h"
static int range_processor(FILE *fp){
    int min = INT_MAX;
    int max = INT_MIN;
    char buf[256] = {0};
    while((fgets(buf, sizeof(buf), fp)) != NULL){ 
        if(buf[0] == '\r'){
            printf("empty line\n");
            return -1;
        }
        char *temp = strtok(buf," ");
        while(temp != NULL){
            int value = atoi(temp);
            min = min > value ? value : min;
            max = max < value ? value : max;
            temp = strtok(NULL," ");
        }
    }
    return max - min;
}
int range(const char *pFname){
    return read_file(pFname, range_processor);
}
 
file_reader.h
#ifndef _FILE_READER_H_
#define _FILE_READER_H_
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
int read_file(const char* pFname, int(*processor)(FILE *fp));
#ifdef __cplusplus
}
#endif
#endif
 
file_reader.c
#include "file_reader.h"
int read_file(const char* pFname, int(*processor)(FILE *fp)){
    FILE *fp = fopen(pFname, "r");
    if(fp == NULL)
        return -1;
    int ret = processor(fp);
    fclose(fp);
    return ret;
}
 
range_test.c
#include <stdio.h>
#include "range.h"
int main(int argc, char const *argv[])
{
    int ret = range("nums.txt");
    printf("ret is %d\n", ret);
    return 0;
}
 
如上: 文件的打开和关闭操作集中在read_file中。
这样代码的可读性提高了,函数的功能也更加专一。
 
此例中 range_processor 可以被替代为其他的功能函数,谓之模板方法模式。例如:
int ret = sum("nums.txt");
 
int sum(const char *pFname){
    return read_file(pFname, sum_processor);
}
 
static int sum_processor(FILE *fp){
    int sum = 0;
    char buf[256] = {0};
    while((fgets(buf, sizeof(buf), fp)) != NULL){ 
        if(buf[0] == '\r'){
            printf("empty line\n");
            return -1;
        }
        char *temp = strtok(buf," ");
        while(temp != NULL){
            int value = atoi(temp);
            sum += value;
            temp = strtok(NULL," ");
        }
    }
    return sum;
}
 
 
posted @ 2019-12-09 17:11    阅读(142)  评论(0)    收藏  举报