模板方法(template method)设计模式用于定义一个包含许多步骤的算法框架,允许子类重写(覆盖)算法的某一个步骤而不改变算法整体的流程和框架。
模板方法提供的流程是骨架,子类无须覆盖模板方法本身,只需继承即可,即模板方法无须是 virtual 的。
例如一个算法(如聚类算法)可能包含初始化(initialization)、迭代(iteration)以及后处理(post-preprocessing)三个环节,现实中存在多种初始化(initialization)的方法。
实现模板方法设计模式的手段即是声明一个包含模板方法的抽象基类,该模板方法用于调用其他原生操作,子类可对这些原生操作重写和覆盖。
实现上:
在模板方法(基类)内部定义程序或算法的执行流程,也即模板方法是整个算法执行的起点。
其 UML 类图如下:
#include <iostream>
#include <boost\current_function.hpp>
#include <string>
class Algorithm
{
public:
void calculate()
// 模板方法
{
initilization();
iteration();
postprocessing();
}
protected:
virtual void initilization() = 0;
virtual void iteration() = 0;
virtual void postprocessing() = 0;
};
class AAlgorithm :public Algorithm
{
private:
void initilization()
{
std::cout << std::string("AAlgorithm ") + BOOST_CURRENT_FUNCTION << std::endl;
}
void iteration()
{
std::cout << std::string("AAlgorithm ") + BOOST_CURRENT_FUNCTION << std::endl;
}
void postprocessing()
{
std::cout << std::string("AAlgorithm ") + BOOST_CURRENT_FUNCTION << std::endl;
}
};
class BAlgorithm :public Algorithm
{
private:
void initilization()
{
std::cout << std::string("BAlgorithm ") + BOOST_CURRENT_FUNCTION << std::endl;
}
void iteration()
{
std::cout << std::string("BAlgorithm ") + BOOST_CURRENT_FUNCTION << std::endl;
}
void postprocessing()
{
std::cout << std::string("BAlgorithm ") + BOOST_CURRENT_FUNCTION << std::endl;
}
};
int main(int, char**)
{
AAlgorithm aalgo;
BAlgorithm balgo;
aalgo.calculate();
std::cout << "==============================" << std::endl;
balgo.calculate();
return 0;
}