模板方法模式
C++
#include <iostream>
using namespace std;class TestPaper
{
public:void TestQ1(){cout << "杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[ ]\na.球磨铸铁 b.马口贴 c.高速合金钢 d.碳素纤维" << endl;cout << "答案: " << Answer1() << endl;}void TestQ2(){cout << "杨过、程英、陆无双铲除了情花,造成[ ]\na.使这种植物不再害人 b.使一种珍稀物种灭绝c.破坏了那个生物圈的生态平衡d.造成该地区沙漠化" << endl;cout << "答案: " << Answer2() << endl;}void TestQ3(){cout << "蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[ ]\na.阿司匹林b.牛黄解毒片c.氟哌酸d.让他们喝大量的生牛奶e.以上全不对" << endl;cout << "答案: " << Answer3() << endl;}virtual string Answer1(){return "null";}virtual string Answer2(){return "null";}virtual string Answer3(){return "null";}
};class TestPaperA : public TestPaper
{string Answer1(){return "a";}string Answer2(){return "b";}string Answer3(){return "c";}
};class TestPaperB : public TestPaper
{string Answer1(){return "a";}string Answer2(){return "a";}string Answer3(){return "a";}
};int main()
{cout << "同学A答题情况: " << endl;TestPaper *A = new TestPaperA();A->TestQ1();A->TestQ2();A->TestQ3();cout << endl;cout << "同学B答题情况: " << endl;TestPaper *B = new TestPaperB();B->TestQ1();B->TestQ2();B->TestQ3();return 0;
}
C
#include <stdio.h>
#include <string.h>
typedef struct
{char question[256];char answer[256];
} Question;typedef struct
{Question questions[3];char *(*getAnswer)(int questionIndex);
} TestPaperBase;// 定义问题
Question g_questions[3] = {{"杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是[ ]\na.球磨铸铁 b.马口贴 c.高速合金钢 d.碳素纤维", "null"},{"杨过、程英、陆无双铲除了情花,造成[ ]\na.使这种植物不再害人 b.使一种珍稀物种灭绝c.破坏了那个生物圈的生态平衡d.造成该地区沙漠化", "null"},{"蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[ ]\na.阿司匹林b.牛黄解毒片c.氟哌酸d.让他们喝大量的生牛奶e.以上全不对", "null"}
};char *getAnswerA(int index)
{switch (index){case 0:return "a";case 1:return "b";case 2:return "c";default:return "Invalid question index";}
}char *getAnswerB(int index)
{switch (index){case 0:return "a";case 1:return "a";case 2:return "a";default:return "Invalid question index";}
}void TestQ(TestPaperBase *paper, int qIndex)
{strncpy(paper->questions[qIndex].answer, paper->getAnswer(qIndex), sizeof(paper->questions[qIndex].answer) - 1);printf("%s\n", paper->questions[qIndex].question);printf("答案:%s\n", paper->questions[qIndex].answer);
}int main()
{TestPaperBase TestPaperA;memcpy(TestPaperA.questions, g_questions, sizeof(g_questions));TestPaperA.getAnswer = getAnswerA;printf("同学A答题情况:\n");TestQ(&TestPaperA, 0);TestQ(&TestPaperA, 1);TestQ(&TestPaperA, 2);printf("\n");TestPaperBase TestPaperB;memcpy(TestPaperB.questions, g_questions, sizeof(g_questions));TestPaperB.getAnswer = getAnswerB;printf("同学B答题情况:\n");TestQ(&TestPaperB, 0);TestQ(&TestPaperB, 1);TestQ(&TestPaperB, 2);return 0;
}
总结
设计基类的时候,最大程度上的去复用代码,尽可能的泛化。细节高层次的差别的地方可以virtual,要求子类重写。