1.模板方法模式简介
- 英文名称
Template Method - 主要目的
该模式定义一个操作中的算法的基本框架,而将一些步骤延迟到子类中进行。模板方法模式可以使得子类在不改变算法框架的情况下,重定义该算法的某些特定步骤。 - 使用场景
1.一次性实现一个算法不变的部分,并将可变的部分留给子类来实现;
2.各个子类的公共行为被提取出来并集中到一个公共父类中进行,从而减少代码重复;
3.控制子类在特定点进行扩展。
2.模板方法模式代码示例
- 测试平台
1.开发语言:C++
2.开发工具:VS2015
3.操作系统:Win7 X64 - 代码说明
1.AbstractPlateAlgClass–抽象类,定义算法的基本骨架;
2.ConcreateAlgA、ConcreateAlgB–具体类,可以重定义算法的某些步骤。
注意:
1.本例用模板方法模式来说明如何重定义算法的某些步骤;
2.通过模板方法模式,我们可以规定算法必须的各个步骤,同时又允许重定义某些步骤以保证算法的灵活性。
- 具体代码
#include <iostream>
using namespace std;
//传统的车牌识别算法分为以下四个步骤:预处理、车牌定位、车牌分割、字符识别。
//抽象类,定义算法的基本骨架
class AbstractPlateAlgClass
{
public:
//预处理
virtual void PreProcesser() = 0;
//车牌定位
virtual void PlateLocation() = 0;
//车牌定位
virtual void PlateSegmation() = 0;
//车牌定位
virtual void PlateRecognition() = 0;
//车牌识别模板方法,定义算法的基本步骤
void PlateAlgTemplateMethod()
{
PreProcesser();
PlateLocation();
PlateSegmation();
PlateRecognition();
}
};
//具体类,实现算法A
class ConcreateAlgA :public AbstractPlateAlgClass
{
public:
//预处理
void PreProcesser()
{
cout << "算法A,车牌预处理" << endl;
}
//车牌定位
void PlateLocation()
{
cout << "算法A,车牌定位" << endl;
}
//车牌分割
void PlateSegmation()
{
cout << "算法A,车牌分割" << endl;
}
//字符识别
void PlateRecognition()
{
cout << "算法A,字符识别" << endl;
}
};
//具体类,实现算法B
class ConcreateAlgB :public AbstractPlateAlgClass
{
public:
//预处理
void PreProcesser()
{
cout << "算法B,车牌预处理" << endl;
}
//车牌定位
void PlateLocation()
{
cout << "算法B,车牌定位" << endl;
}
//车牌分割
void PlateSegmation()
{
cout << "算法B,车牌分割" << endl;
}
//字符识别
void PlateRecognition()
{
cout << "算法B,字符识别" << endl;
}
};
int main()
{
//利用算法A进行车牌识别
AbstractPlateAlgClass *pAlgA = new ConcreateAlgA();
if (pAlgA !=NULL)
{
pAlgA->PlateAlgTemplateMethod();
delete pAlgA;
pAlgA = NULL;
}
cout << "******************************************" << endl;
//利用算法B进行车牌识别
AbstractPlateAlgClass *pAlgB = new ConcreateAlgB();
if (pAlgB != NULL)
{
pAlgB->PlateAlgTemplateMethod();
delete pAlgB;
pAlgB = NULL;
}
getchar();
return 0;
}
- 输出结果
栏目导航
上一篇:设计模式学习笔记(C++实现)(二十二)–策略模式
下一篇:设计模式学习笔记(C++实现)(二十四)–访问者模式
参考文献:
1.《设计模式:可复用面向对象软件的基础》