23种设计模式C++实现——模板方法模式
在做面向对象的软件开发时我们往往想达到更高的代码可复用性和更合理的软件颗粒度。
根据《设计模式——可复用面向对象软件的基础》所说:“你必须找到相关的对象,以适当的颗粒度将他们回归类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。”
内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用的解决方案。这些重复的模式方案解决特定的问题,使得面向对象的设计更灵活、优雅,最终复用性更好。它们帮助设计者将新的设计建立在以往的工作基础上,复用以往的成功设计方案。一个熟悉这些设计模式的设计者不需要再去发现它们,而能够立即将他们应用于设计问题中。
本系列文章主要参考文献为——设计模式,可复用面向对象软件的基础(Design Patterns Elements of Reusable Object-Oriented SoftWare Erich.),内部代码基本用C++语言编写。
汇总链接:23种设计模式C++实现——概要(索引汇总)
本章主要说明模板方法模式,该设计模式主要意图是:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,子类可以不改变一个算法的机构即可重新定义该算法某些特定步骤。
该设计模式的参与者有4个,分别是:
这里实现一个以做考卷为抽象类的模板方法,做一份考试卷是有很多相同点的,我们一般在做卷子时通常要经过以下几个步骤:
举个例子,不论是做语文卷还是英语卷都要经过这几步,但是在写班级名字时英语卷需要写英文名,答卷时所完成的内同不同。
我们可以把这几步相同的步骤整合成为答卷的一个标准流程,具体答卷内容根据所答的卷子来确定,代码如下。
声明:
/****************************************************************
Doc : template.h
Author : BingLee
Date : 2020-7-6
Info : Template Design Patten
https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#ifndef TEMPLATE_H
#define TEMPLATE_H
class ExamationPaper
{
public:
ExamationPaper();
void doPaper();
protected:
virtual void fillPersonalInfo() = 0;
virtual void finishPaper() = 0;
virtual void handInpaper() = 0;
};
实现:
/****************************************************************
Doc : template.cpp
Author : BingLee
Date : 2020-7-6
Info : Template Design Patten
https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#include "template.h"
#include
#include
ExamationPaper::ExamationPaper()
{
}
void ExamationPaper::doPaper()
{
fillPersonalInfo();
finishPaper();
handInpaper();
}
声明:
class EnglishExamationPaper : public ExamationPaper
{
public:
EnglishExamationPaper();
protected:
void fillPersonalInfo();
void finishPaper();
void handInpaper();
};
实现:
EnglishExamationPaper::EnglishExamationPaper()
{
}
void EnglishExamationPaper::fillPersonalInfo()
{
printf("EN--Bing class 2 grade 3\n");
}
void EnglishExamationPaper::finishPaper()
{
printf("EN--Complete the English test paper\n");
}
void EnglishExamationPaper::handInpaper()
{
printf("EN--hand in English paper\n");
}
声明:
class chineseExamationPaper : public ExamationPaper
{
public:
chineseExamationPaper();
protected:
void fillPersonalInfo();
void finishPaper();
void handInpaper();
};
#endif // TEMPLATE_H
实现:
chineseExamationPaper::chineseExamationPaper()
{
}
void chineseExamationPaper::fillPersonalInfo()
{
printf("CN--Bing class 2 grade 3\n");
}
void chineseExamationPaper::finishPaper()
{
printf("CN--Complete the Chinese test paper\n");
}
void chineseExamationPaper::handInpaper()
{
printf("CN--hand in Chinese paper\n");
}
/****************************************************************
Doc : main.cpp
Author : BingLee
Date : 2020-7-6
Info : Template Design Patten
https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#include
#include "template.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
EnglishExamationPaper *englishPaper = new EnglishExamationPaper();
chineseExamationPaper *chinesePaper = new chineseExamationPaper();
englishPaper->doPaper();
chinesePaper->doPaper();
return a.exec();
}
输出结果:
该模式的实现相对来说比较简单,并且在工作或开发中大家都有用到,如果有问题可以在博客下留言交流~
本篇博客中的代码均已通过编译,如有Bug,请提出宝贵意见~
注:文章内函数可以把除Client对象的声明放在一个头文件中,实现放在一个文件中,Client文件放在主函数中执行。
参考:
设计模式——可复用面向对象软件的基础