Template Method模式
Intention:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可
重新定义该算法的某些特定步骤。
When:
对于一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架是相同的,TemplateMethod提供了
这种情况的一个实现框架。
Explain:
Strategy模式解决的是和TemplateMethod模式类似的问题,但是Strategy模式是将逻辑封装到一个类中,并采取组合(委托)
的方式解决这个问题。
TemplateMethod模式实际上就是利用面向对象中多态的概念实现算法实现细节和高层接口的松耦合。TemplateMethod模式
采用继承来实现。由于继承是一种强约束性的条件,因此给TemplateMethod模式带来一些不便之处:子类中实现的具体算法是不能
被别的类复用的,这也是继承所固有的问题。Strategy模式则通过组合来达到和TemplateMethod模式类似的效果,其代价就是空间
和时间上的代价。
C++ Code Example:
//template.h
#ifndef TEMPLATE_H
#define TEMPLATE_H
class AbstractClass{
public:
virtual ~AbstractClass();
void TemplateMethod();
protected:
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
AbstractClass();
};
class ConcreteClass1 : public AbstractClass{
public:
ConcreteClass1();
~ConcreteClass1();
protected:
void PrimitiveOperation1();
void PrimitiveOperation2();
};
class ConcreteClass2 : public AbstractClass{
public:
ConcreteClass2();
~ConcreteClass2();
protected:
void PrimitiveOperation1();
void PrimitiveOperation2();
};
#endif // TEMPLATE_H
//template.cpp
#include "template.h"
#include <iostream>
using std::cout;
using std::endl;
AbstractClass::AbstractClass(){
}
AbstractClass::~AbstractClass(){
}
void AbstractClass::TemplateMethod(){
this->PrimitiveOperation1();
this->PrimitiveOperation2();
}
ConcreteClass1::ConcreteClass1(){
}
ConcreteClass1::~ConcreteClass1(){
}
void ConcreteClass1::PrimitiveOperation1(){
cout << "ConcreteClass1::PrimitiveOperation1" << endl;
}
void ConcreteClass1::PrimitiveOperation2(){
cout << "ConcreteClass1::PrimitiveOperation2" << endl;
}
ConcreteClass2::ConcreteClass2(){
}
ConcreteClass2::~ConcreteClass2(){
}
void ConcreteClass2::PrimitiveOperation1(){
cout << "ConcreteClass2::PrimitiveOperation1" << endl;
}
void ConcreteClass2::PrimitiveOperation2(){
cout << "ConcreteClass2::PrimitiveOperation2" << endl;
}
//main.cpp
<pre style="margin-top: 0px; margin-bottom: 0px;"><span style=" color:#000080;">#include</span><span style=" color:#c0c0c0;"> </span><span style=" color:#008000;">"template.h"</span>
#include <iostream>
using namespace std;
int main(int argc,char* argv[]){
AbstractClass* p1 = new ConcreteClass1();
AbstractClass* p2 = new ConcreteClass2();
p1->TemplateMethod();
p2->TemplateMethod();
return 0;
}