当前位置: 首页 > news >正文

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

模板方法模式

在这里插入图片描述

C++

#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

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

相关文章:

  • Python:基础爬虫
  • 【odoo17】富文本小部件widget=“html“的使用
  • sqli-labs 靶场 less-7 第七关详解:OUTFILE注入与配置
  • 英伟达开源 3400 亿参数模型;苹果 iOS 18 紧急 SOS 新增实时视频功能丨 RTE 开发者日报 Vol.225
  • VB.net调用VC DLL
  • 实战 | 基于YOLOv10的车辆追踪与测速实战【附源码+步骤详解】
  • 智慧工厂监控可视化解决方案(160页WORD)
  • 从零开始学GeoServer源码(一)(搭建开发环境Win10+IDEA23.3.5+jdk11+geoserver2.24.x)
  • Zenity向Ubuntu系统发送通知
  • 安全测试入门基础大全。。费了大功夫整理(超级全面)
  • [AIGC] Java List接口详解
  • 从0到1实现YOLOv3
  • linux在文件夹中查找文件内容
  • MySql 数据库、表常用语句
  • 微软如何打造数字零售力航母系列科普13 - Prime Focus Technologies在NAB 2024上推出CLEAR®对话人工智能联合试点
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular6错误 Service: No provider for Renderer2
  • ES学习笔记(12)--Symbol
  • Flannel解读
  • Java反射-动态类加载和重新加载
  • node入门
  • Python进阶细节
  • Quartz初级教程
  • React as a UI Runtime(五、列表)
  • Spring Cloud中负载均衡器概览
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue ES6 Jade Scss Webpack Gulp
  • 前端工程化(Gulp、Webpack)-webpack
  • 选择阿里云数据库HBase版十大理由
  • #include<初见C语言之指针(5)>
  • #stm32驱动外设模块总结w5500模块
  • #控制台大学课堂点名问题_课堂随机点名
  • $GOPATH/go.mod exists but should not goland
  • (1)(1.13) SiK无线电高级配置(五)
  • (4)事件处理——(7)简单事件(Simple events)
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (第二周)效能测试
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (篇九)MySQL常用内置函数
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十八)SpringBoot之发送QQ邮件
  • (一) storm的集群安装与配置
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • .NET Core中Emit的使用
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [ABC294Ex] K-Coloring
  • [Android] 修改设备访问权限
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [asp.net core]project.json(2)
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [docker]docker网络-直接路由模式
  • [FFmpeg学习]从视频中获取图片