设计模式学习笔记(C++实现)(二十三)--模板方法模式

1.模板方法模式简介

  • 英文名称
    Template Method
  • 主要目的
    该模式定义一个操作中的算法的基本框架,而将一些步骤延迟到子类中进行。模板方法模式可以使得子类在不改变算法框架的情况下,重定义该算法的某些特定步骤。
  • 使用场景
    1.一次性实现一个算法不变的部分,并将可变的部分留给子类来实现;
    2.各个子类的公共行为被提取出来并集中到一个公共父类中进行,从而减少代码重复;
    3.控制子类在特定点进行扩展。

2.模板方法模式代码示例

  • 测试平台
    1.开发语言:C++
    2.开发工具:VS2015
    3.操作系统:Win7 X64
  • 代码说明
    1.AbstractPlateAlgClass–抽象类,定义算法的基本骨架;
    2.ConcreateAlgA、ConcreateAlgB–具体类,可以重定义算法的某些步骤。

注意:
1.本例用模板方法模式来说明如何重定义算法的某些步骤;
2.通过模板方法模式,我们可以规定算法必须的各个步骤,同时又允许重定义某些步骤以保证算法的灵活性。

  • 具体代码
#include 
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++实现)(二十三)--模板方法模式_第1张图片

栏目导航
上一篇:设计模式学习笔记(C++实现)(二十二)–策略模式
下一篇:设计模式学习笔记(C++实现)(二十四)–访问者模式

参考文献:
1.《设计模式:可复用面向对象软件的基础》

你可能感兴趣的:(设计模式,设计模式学习笔记(C++实现))