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

81 篇文章 0 订阅
29 篇文章 1 订阅

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

UML 图
这里写图片描述

运行效果图:
这里写图片描述

代码:
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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值