C语言实现《大话设计模式》中的模板方法模式例程#ifndef __TEMPLATEMETHOD_H__#define __TEMPLATEMETHOD_H__#include "rtthread.h"#include "finsh.h"//考卷typedef struct _TestPaper TestPaper;struct _TestPaper{ void (*TestPaperDelete)(void *pTestPaper); void (*TestQuestion1)(void *pTestPaper); void (*TestQuestion2)(void *pTestPaper); void (*TestQuestion3)(void *pTestPaper); char (*Answer1)(); char (*Answer2)(); char (*Answer3)();};static void TestPaperDelete(void *pTestPaper){ rt_free(pTestPaper);}static void TestQuestion1(void *pTestPaper){ rt_kprintf(" 杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的废铁可能是[] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维\n"); rt_kprintf(" 答案:%c\n", ((TestPaper *)pTestPaper)->Answer1());}static void TestQuestion2(void *pTestPaper){ rt_kprintf(" 杨过、程英、陆无双铲除情花造成[] a.情花不再害人 b.情花灭绝 c.破坏生态平衡 d.该地区沙漠化\n"); rt_kprintf(" 答案:%c\n", ((TestPaper *)pTestPaper)->Answer2());}static void TestQuestion3(void *pTestPaper){ rt_kprintf(" 蓝凤凰使华山师徒、桃谷六仙呕吐不至的药是[] a.阿司匹林 b.牛黄解毒 c.氟派酸 d.生牛奶 e.以上都不对\n"); rt_kprintf(" 答案:%c\n", ((TestPaper *)pTestPaper)->Answer3());}static char Answer1(void){ return ' ';}static char Answer2(void){ return ' ';}static char Answer3(void){ return ' ';}TestPaper *TestPaperCreate(rt_size_t Size){ TestPaper *pTestPaper = (TestPaper *)rt_malloc(Size); pTestPaper->TestQuestion1 = TestQuestion1; pTestPaper->TestQuestion2 = TestQuestion2; pTestPaper->TestQuestion3 = TestQuestion3; pTestPaper->Answer1 = Answer1; pTestPaper->Answer2 = Answer2; pTestPaper->Answer3 = Answer3; pTestPaper->TestPaperDelete = TestPaperDelete; return pTestPaper;}//学生A的考卷typedef struct _TestPaperA TestPaperA;struct _TestPaperA{ TestPaper mTestPaper;};static char TestPaperAAnswer1(void){ return 'a';}static char TestPaperAAnswer2(void){ return 'b';}static char TestPaperAAnswer3(void){ return 'c';}TestPaperA *TestPaperACreate(rt_size_t Size){ TestPaperA *pTestPaperA = (TestPaperA *)TestPaperCreate(Size); ((TestPaper *)pTestPaperA)->Answer1 = TestPaperAAnswer1; ((TestPaper *)pTestPaperA)->Answer2 = TestPaperAAnswer2; ((TestPaper *)pTestPaperA)->Answer3 = TestPaperAAnswer3; return pTestPaperA;}//学生B的考卷typedef struct _TestPaperB TestPaperB;struct _TestPaperB{ TestPaper mTestPaper;};static char TestPaperBAnswer1(void){ return 'c';}static char TestPaperBAnswer2(void){ return 'd';}static char TestPaperBAnswer3(void){ return 'e';}TestPaperB *TestPaperBCreate(rt_size_t Size){ TestPaperB *pTestPaperB = (TestPaperB *)TestPaperCreate(Size); ((TestPaper *)pTestPaperB)->Answer1 = TestPaperBAnswer1; ((TestPaper *)pTestPaperB)->Answer2 = TestPaperBAnswer2; ((TestPaper *)pTestPaperB)->Answer3 = TestPaperBAnswer3; return pTestPaperB;}#endif#include "TemplateMethod.h"//客户端void Template(void){ TestPaperA *StudentA = TestPaperACreate(sizeof(TestPaperA)); TestPaperB *StudentB = TestPaperBCreate(sizeof(TestPaperB)); rt_kprintf(" 学生A的答卷:\n"); ((TestPaper *)StudentA)->TestQuestion1(StudentA); ((TestPaper *)StudentA)->TestQuestion2(StudentA); ((TestPaper *)StudentA)->TestQuestion3(StudentA); rt_kprintf(" 学生B的答卷:\n"); ((TestPaper *)StudentB)->TestQuestion1(StudentB); ((TestPaper *)StudentB)->TestQuestion2(StudentB); ((TestPaper *)StudentB)->TestQuestion3(StudentB); ((TestPaper *)StudentA)->TestPaperDelete(StudentA); ((TestPaper *)StudentB)->TestPaperDelete(StudentB);}FINSH_FUNCTION_EXPORT(Template, Template Modle);将一个算法的骨架定义成一个类,把其中一些容易改变的地方可以让子类重写,重写时不改变算法的架构,而能重新生成需要的对像,相当于搞个模板,然后将自己需要的东西用重写的方式添加进去。