模板方法模式原理相对比较简单,理解上也不存在困难。实际上就是把固定的(步骤)流程封装起来,然后通过改变每一个具体步骤来实现不同功能。
举个栗子。【因为最近在学习机器视觉(准备入坑),那就以传统的图像处理步骤为例来讲述模板方法模式。】
比如说:我现在进行图像处理,需要从图像中获取我想要得到的信息。那么,拿到一张图片后的处理可以分为三个基本流程(顺序执行):图像预处理,特征提取,特征分析。
对于产品A来说:图像预处理需要进行高斯去噪;特征提取需要进行canny边缘提取;特征分析需要对提取的边缘长度和夹角进行判断分析。
对于产品B来说:图像预处理需要进行均值去噪;特征提取需要进行OTSU阈值提取;特征分析需要对提取的区域面积和中心点进行判断分析。
对于产品C来说:图像预处理需要进行中值去噪;特征提取需要进行LBP纹理提取;特征分析需要对提取的特征按照要求进行判断分类。
以上述为例,直接上代码。
#include<iostream>
class VisionInspection
{
protected:
virtual void imagePreprocessing() = 0;
virtual void imageFeatureExtract() = 0;
virtual void iamgeFeatureAnalysis() = 0;
public:
void imageProcessing()
{
imagePreprocessing();
imageFeatureExtract();
iamgeFeatureAnalysis();
}
};
class InspectProductA:public VisionInspection
{
protected:
virtual void imagePreprocessing()
{
std::cout << "首先,对图像进行高斯去噪" << std::endl;
}
virtual void imageFeatureExtract()
{
std::cout << "然后,通过canny算法提取目标边缘" << std::endl;
}
virtual void iamgeFeatureAnalysis()
{
std::cout << "最后,分析提取的目标边缘直线的长度和夹角,得出结果" << std::endl;
}
};
class InspectProductB :public VisionInspection
{
protected:
virtual void imagePreprocessing()
{
std::cout << "首先,对图像进行均值去噪" << std::endl;
}
virtual void imageFeatureExtract()
{
std::cout << "然后,通过OTSU算法对目标进行二值化阈值提取" << std::endl;
}
virtual void iamgeFeatureAnalysis()
{
std::cout << "最后,分析提取的目标的面积和中心点,得出结果" << std::endl;
}
};
class InspectProductC :public VisionInspection
{
protected:
virtual void imagePreprocessing()
{
std::cout << "首先,对图像进行中值去噪" << std::endl;
}
virtual void imageFeatureExtract()
{
std::cout << "然后,对图像进行LBP纹理特征提取" << std::endl;
}
virtual void iamgeFeatureAnalysis()
{
std::cout << "最后,分析目标的LBP纹理特征,得出结果" << std::endl;
}
};
void main()
{
VisionInspection *make_inspection1 = new InspectProductA();
make_inspection1->imageProcessing();
VisionInspection *make_inspection2 = new InspectProductB();
make_inspection2->imageProcessing();
VisionInspection *make_inspection3 = new InspectProductC();
make_inspection3->imageProcessing();
delete make_inspection1;
delete make_inspection2;
delete make_inspection3;
system("pause");
return;
}