模板方法模式(大话设计模式)C/C++版本

模板方法模式

C++

cpp 复制代码
#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

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,要求子类重写。

相关推荐
CodeWithMe32 分钟前
【C/C++】不同防止头文件重复包含的措施
c语言·开发语言·c++
qqxhb1 小时前
零基础设计模式——行为型模式 - 命令模式
java·设计模式·go·命令模式
whoarethenext1 小时前
使用 C/C++的OpenCV 实现模板匹配:从基础到优化
c语言·c++·opencv
合方圆~小文2 小时前
架空线路图像视频监测装置
c语言·c++·人工智能·嵌入式硬件·硬件工程·模拟退火算法
SAP-nkGavin2 小时前
ABAP设计模式之---“童子军法则(The Boy Scout Rule)”
设计模式·sap·abap
蔡蓝2 小时前
设计模式-适配器模式
java·设计模式·适配器模式
卖猪肉的痴汉3 小时前
4.2 C/C++开发环境:VSCode+CMake+MSYS2
c语言·c++·vscode
少女续续念3 小时前
【DevOps】测试用例越来越多,质量反而更差了?谈谈现代软件测试的误区与转型
设计模式
ღ 噫吁嚱3 小时前
【C/C++】实现固定地址函数调用
c语言·开发语言·c++
jinmo_C++4 小时前
第十四届蓝桥杯_省赛B组(C).冶炼金属
c语言·职场和发展·蓝桥杯