Gof定义

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个 算法的结构即可重定义该算法的某些特定步骤。

动机

在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

模板方法模式结构图:

2010-12-29_122541

AbstractClass类:这个抽象类中定义了一个模板方法TemplateMethod,该方法通常为一个具体方法,将抽象类中的一些抽象的操作组合在其中,推迟到子类实现。

ConcreteClass类:按照需求实现父类定义的一个或多个抽象方法。

一个小的例子来反映上面的结构:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/// <summary>
/// 测试车的类--->AbstractClass
/// </summary>
public abstract class Vehical
{
protected abstract void Start(); //PrimitiveOperation
protected abstract void Run(); //PrimitiveOperation
protected abstract void Trun(); //PrimitiveOperation
protected abstract void Stop(); //PrimitiveOperation
/// <summary>
/// 相当于TemplateMethod
/// </summary>
public void Test()
{
//做记录等操作
Start();
Run();
Trun();
Stop();
}
}
/// <summary>
/// 红旗车--->ConcreteClass
/// </summary>
public class HongQiCar : Vehical
{
protected override void Start()
{
Console.WriteLine("测试红旗车启动");
}
protected override void Run()
{
Console.WriteLine("测试红旗车行驶");
}
protected override void Trun(int degree)
{
Console.WriteLine("测试红旗车转向");
}
protected override void Stop()
{
Console.WriteLine("测试红旗车停止");
}
}
/// <summary>
/// QQ车--->ConcreteClass
/// </summary>
public class QQCar : Vehical
{
protected override void Start()
{
Console.WriteLine("测试QQ车启动");
}
protected override void Run()
{
Console.WriteLine("测试QQ车行驶");
}
protected override void Trun(int degree)
{
Console.WriteLine("测试QQ车转向");
}
protected override void Stop()
{
Console.WriteLine("测试QQ车停止");
}
}
/// <summary>
/// 客户代码
/// </summary>
public class App
{
static void Main()
{
Vehical vehical;
vehical = new HongQiCar();
vehical.Test();
vehical = new QQCar();
vehical.Test();
Console.ReadLine();
}
}

Template Method模式的几个要点

  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  • 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
  • 在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

返回开篇(索引)