模板方法模式(大话设计模式)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,要求子类重写。

相关推荐
你好,我叫C小白3 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
朱嘉鼎5 小时前
状态机的介绍
c语言·单片机
Neverfadeaway6 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
一碗绿豆汤6 小时前
c语言-流程控制语句
c语言
子牙老师6 小时前
从零手写gdb调试器
c语言·linux内核·gdb·调试器
小莞尔7 小时前
【51单片机】【protues仿真】基于51单片机主从串行通信系统
c语言·单片机·嵌入式硬件·物联网·51单片机
Hello_Embed7 小时前
STM32 环境监测项目笔记(一):DHT11 温湿度传感器原理与驱动实现
c语言·笔记·stm32·单片机·嵌入式软件
逐步前行9 小时前
C标准库--浮点<float.h>
c语言·开发语言
水饺编程10 小时前
第3章,[标签 Win32] :窗口类03,窗口过程函数字段
c语言·c++·windows·visual studio
雨落在了我的手上12 小时前
C语言入门(十):函数的深入认识
c语言