使用模板方法模式实现选择题答题 C++

说下对模板模式的理解:
模板模式, 定义一个操作中的算法的骨架, 而将一部分的步骤延时到子类中去。 通过模板方法, 使得子类可以在不改变一个算法结构的情况下, 可以重新定义算法的某些特定步骤。
他将不变的行为搬移到超类中去, 去除了类中的重复代码, 体现出他代码复用的优势。
ie, 当不变的和可变的行为在方法的子类实现中混合在一起的时候, 不变的行为会重复在子类中出现, 这时候, 我们可以考虑使用模板方法模式, 将这些不变的行为搬移到单一的地方去, 由此帮助子类摆脱重复的不变行为的纠缠。

UML 图

运行效果图:
使用模板方法模式实现选择题答题 C++_第1张图片

代码:
testPaper.h

#ifndef _TESTPAPER_H_
#define _TESTPAPER_H_

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

/************************************************************************/
/* 试卷模板 */
/************************************************************************/
class CTestPaper{
public:
    void showPaper() const{
        Start();
        TestQuestion1();
        TestQuestion2();
        TestQuestion3();
        Stop();
    }

private:
    void Start() const {
        cout << "========================================================" << endl;
        cout << "=== name :\t" << StudentName() <<"\t==========="<< endl;
    }

    void Stop() const {
        cout << "========================================================" << endl;
    }

    void TestQuestion1() const{
        cout << "杨过得到, 后来给了郭靖, 炼成倚天剑,屠龙刀的玄铁可能是【】 a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维" << endl;
        cout << "你的答案是:【" << Answer1() << "】" << endl;
    }

    void TestQuestion2() const{
        cout << "杨过,程英,陆无双铲除了情花, 造成【】a.使这种植物不在害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化" << endl;
        cout << "你的答案是:【" << Answer2() << "】" << endl;
    }

    void TestQuestion3() const{
        cout << "蓝凤凰只是华山试图, 桃谷六仙呕吐不止, 如果你是大夫, 会给他们开什么药【】 a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们和大量的生牛奶 e.以上都不对" << endl;
        cout << "你的答案是:【" << Answer3() << "】" << endl;
    }

    virtual string Answer1() const { return ""; }
    virtual string Answer2() const { return ""; }
    virtual string Answer3() const { return ""; }
    virtual string StudentName() const { return ""; }

};

/************************************************************************/
/* 学生1试卷 */
/************************************************************************/
class CStuPaper1 : public CTestPaper{
    string Answer1() const override { return "a"; }
    string Answer2() const override { return "b"; }
    string Answer3() const override { return "c"; }
    string StudentName() const override { return "lisi"; }
};

/************************************************************************/
/* 学生2试卷 */
/************************************************************************/
class CStuPaper2 : public CTestPaper{
    string Answer1() const override { return "b"; }
    string Answer2() const override { return "b"; }
    string Answer3() const override { return "c"; }
    string StudentName() const override { return "zhangsan"; }
};

#endif // _TESTPAPER_H_

main.cpp

#include "TestPaper.h"

#include <memory>
#include <iostream>

using namespace std;

int main(){
    shared_ptr<CTestPaper> paper(new CStuPaper1);
    paper->showPaper();

    paper = shared_ptr<CTestPaper>(new CStuPaper2);
    paper->showPaper();

    system("pause");
    return EXIT_SUCCESS;
}

你可能感兴趣的:(设计模式,C++)