/************************************************************************ * 模板方法模式学习笔记[C++] * Author: 陈相礼 * Time: 2009.12.03 * Compiler: VC8 ************************************************************************/ #include "TemplateMethodPattern.h" #include "TemplateMethodPattern1.h" #include <iostream> #include <string> using namespace std; void main( void ) { //-----------------模板方法模式原理类测试------------------- CAbstractClass *c; c = new CConcreteClassA(); c->vTemplateMethoc(); delete(c); c = new CConcreteClassB(); c->vTemplateMethoc(); delete(c); //-----------------模板方法模式应用类测试------------------- cout << "学生甲抄的试卷:" << endl; // 将子类变量指针改为父类,利用多态性,实现代码复用 CTestPaper *studentA = new CTestPaperA(); studentA->vTestQuestion1(); studentA->vTestQuestion2(); studentA->vTestQuestion3(); delete(studentA); cout << "学生乙抄的试卷:" << endl; CTestPaper *studentB = new CTestPaperB(); studentB->vTestQuestion1(); studentB->vTestQuestion2(); studentB->vTestQuestion3(); delete(studentB); } /************************************************************************ * 小结: * 1、既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板 * ,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重 * 复。 * 2、当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个 * 别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方 * 法模式来处理。 * 3、模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码 * 来体现它的优势。 * 4、模板方法模式提供了一个很好的代码复用平台。 * 5、当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变 * 的行为就会在子类中重复出现。 * 6、通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆 * 脱重复的不变形为的纠缠。 ************************************************************************/ #pragma once /********************************************** * 模板方法模式原理: * 定义一个操作中的算法的骨架,而将一些步 * 骤延迟到子类中。模板方法使得子类可以不改 * 变一个算法的结构即可重定义该算法的某些特 * 定步骤。 ***********************************************/ #include <iostream> #include <string> using namespace std; //--------------------------------------------- // 抽象算法类 // 实现了一个模板方法,定义了算法骨架, // 具体子类将重定义vPrimitiveOperation以实现 // 一个算法的步骤。 class CAbstractClass { public: // 一些抽象行为,放到子类中去实现 virtual void vPrimitiveOperation1(){}; virtual void vPrimitiveOperation2(){}; // 模板方法,给出逻辑框架,而逻辑的 // 组成是一些相应的抽象操作,他们都 // 是推迟到子类实现 void vTemplateMethoc() { vPrimitiveOperation1(); vPrimitiveOperation2(); cout << "抽象类部分!" << endl; } protected: private: }; //--------------------------------------------- // 实现类A // 定义一个或者多个抽象方法,实现 // vPrimitiveOperation以完成算法中与特定子类 // 相关的步骤。 class CConcreteClassA : public CAbstractClass { public: void vPrimitiveOperation1() { cout << "具体类A方法1的实现!" << endl; } void vPrimitiveOperation2() { cout << "具体类A方法2的实现!" << endl; } protected: private: }; //--------------------------------------------- // 实现类B // 定义一个或者多个抽象方法,实现 // vPrimitiveOperation以完成算法中与特定子类 // 相关的步骤。 class CConcreteClassB: public CAbstractClass { public: void vPrimitiveOperation1() { cout << "具体类B方法1的实现!" << endl; } void vPrimitiveOperation2() { cout << "具体类B方法2的实现!" << endl; } protected: private: }; #pragma once /********************************************** * * 模板方法模式应用:金庸小说试题考试 * ***********************************************/ #include <iostream> #include <string> using namespace std; // 金庸小说考试试卷 class CTestPaper { public: void vTestQuestion1() { cout << "杨过得到,后来给了过境,炼成倚天剑、屠龙刀的玄铁可能是[ ]:" << endl; cout << "a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维" << endl; cout << "答案是:" << strAnswer1() << endl; } void vTestQuestion2() { cout << "杨过、程英、陆无双铲除了情花,造成[ ]" << endl; cout << "a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生态圈的生态平衡 d.造成该地区沙漠化" << endl; cout << "答案是:" << strAnswer2() << endl; } void vTestQuestion3() { cout << "蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[]" << endl; cout << "a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的生牛奶 e.以上全不对" << endl; cout << "答案是:" << strAnswer3() << endl; } protected: virtual string strAnswer1() { return ""; }; virtual string strAnswer2() { return ""; }; virtual string strAnswer3() { return ""; }; private: }; // 学生甲抄的试卷 class CTestPaperA : public CTestPaper { public: protected: string strAnswer1(){ return "b"; }; string strAnswer2(){ return "c"; }; string strAnswer3(){ return "a"; }; private: }; // 学生乙抄的试卷 class CTestPaperB : public CTestPaper { public: protected: string strAnswer1(){ return "c"; }; string strAnswer2(){ return "a"; }; string strAnswer3(){ return "a"; }; private: };