C++設計模式——模板方法(Template Method)
阿新 • • 發佈:2019-02-01
模板方法(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;
}