Template Method

模板方法

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

适用性

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
  • 控制子类扩展。

结构

Template Method Class
Template Method Class

Abstract Class - 定义抽象的基本操作,具体的子类将重定义它们以实现一个算法的各步骤。实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用基本操作,也调用定义在AbstractClass或其他对象中的操作。
ConcreteClass - 实现基本操作以完成算法中与特定子类相关的步骤。

协作:
ConcreteClass靠AbstractClass来实现算法中不变的步骤。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
//---------------------------------------------------
class AbstractClass
{
public:
void template_method()
{

primitive_operation1();
primitive_operation2();

}
protected:
virtual void primitive_operation1() = 0;
virtual void primitive_operation2() = 0;
};
//---------------------------------------------------
class ConcreteClass : public AbstractClass
{
protected:
virtual void primitive_operation1()
{

std::cout << "ConcreteClass: primitive_operation1" << std::endl;
}
virtual void primitive_operation2()
{

std::cout << "ConcreteClass: primitive_operation2" << std::endl;
}
};
//---------------------------------------------------
int main()
{

AbstractClass* a = new ConcreteClass();
a->template_method();
system("Pause");
}

相关模式

  • Factory Method常被模板方法调用。
  • Strategy: 模板方法使用继承来改变算法的一部分。Strategy使用委托来改变整个算法。

[1] 设计模式:可复用面向对象软件的基础
[2] Head First设计模式