1. 定义
模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[DP]
既然使用了继承,并且肯定这个继承是有意义的,就应该要成为子类的模板,所有重复的代码都应该上升到父类去,而不是让每个子类都去重复。
当我们要完成某一细节层次一致的一个过程或一系列步骤,但某个别步骤在实现上可能不同是,通常考虑用模板方法模式来处理。
2. 模板方法模式优点
模板方法模式是通过把不变的行为搬移到超类, 去除子类中的重复代码来体现它的优势。
模板方法模式就是提供了一个很多好的代码复用平台。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠.
3. 实例
/** 模板方法模式 */
#include <iostream>
using namespace std;
/*
实现了一个模板方法, 定义了算法的骨架,
具体子类将重定义PrimitiveOperation以
实现一个算法的步骤.
*/
class AbstractClass
{
public:
void TemplateMethod()
{
cout<<"do something ..."<<endl;
PrimitiveOperation1();
cout<<"do something else ..."<<endl;
PrimitiveOperation2();
cout<<"do something last ..."<<endl;
}
private:
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
};
/*
实现了PrimitiveOperation
以完成算法中与特定子类相关的步骤.
*/
class ConcreteClassA : public AbstractClass
{
private:
void PrimitiveOperation1() override
{
cout<<"具体类A方法1实现."<<endl;
}
void PrimitiveOperation2() override
{
cout<<"具体类A方法2实现."<<endl;
}
};
class ConcreteClassB : public AbstractClass
{
private:
void PrimitiveOperation1() override
{
cout<<"具体类B方法1实现."<<endl;
}
void PrimitiveOperation2() override
{
cout<<"具体类B方法2实现."<<endl;
}
};
/*
模板方法模式是通过把不变的行为搬移到超类, 去除子类中的重复代码来体现它的优势.
模板方法模式就是提供了一个很多好的代码复用平台.
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现.
我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠.
*/
/* 测试 */
int main()
{
AbstractClass *p=new ConcreteClassA();
p->TemplateMethod();
AbstractClass *q=new ConcreteClassB();
q->TemplateMethod();
return 0;
}