您的位置:首页 > 编程语言 > C语言/C++

金庸小说考试之模板方法模式学习笔记[C++版]

2009-12-03 18:31 501 查看
/************************************************************************
* 模板方法模式学习笔记[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:
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: