1) 意图
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤
2) 结构
其中:
- AbstractClass(抽象类)定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤;实现模板方法,定义一个算法骨架,该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作
- ConcreateClass(具体类)定义原语操作以完成算法中与特定子类相关的步骤
3) 适用性
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各个子类中的公共行为应被提前出来并集中到一个公共父类中,以避免代码重复
- 控制子类扩展。
4) 举例
1 #include <iostream> 2 class AbstractClass 3 { 4 public: 5 AbstractClass() {} 6 virtual ~AbstractClass() {} 7 void TemplateMethod() 8 { 9 PrimitiveOperation1(); 10 PrimitiveOperation2(); 11 } 12 protected: 13 virtual void PrimitiveOperation1() = 0; 14 virtual void PrimitiveOperation2() = 0; 15 }; 16 17 class ConcreateClass : public AbstractClass 18 { 19 public: 20 ConcreateClass() {} 21 virtual ~ConcreateClass() {} 22 virtual void PrimitiveOperation1() 23 { 24 std::cout << "PrimitiveOperation1" << std::endl; 25 } 26 virtual void PrimitiveOperation2() 27 { 28 std::cout << "PrimitiveOperation2" << std::endl; 29 } 30 }; 31 32 int main() 33 { 34 AbstractClass* ptr = new ConcreateClass; 35 ptr->TemplateMethod(); 36 delete ptr; 37 system("pause"); 38 }