| 结构 |
 |
| 意图 |
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 |
| 适用性 |
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是O p d y k e 和J o h n s o n 所描述过的“重分解以一般化”的一个很好的例子[ O J 9 3 ]。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
- 控制子类扩展。模板方法只在特定点调用“h o o k ”操作(参见效果一节),这样就只允许在这些点进行扩展。
|
![]()
1 using System;
2
3 class Algorithm
4 {
5 public void DoAlgorithm()
6 {
7 Console.WriteLine("In DoAlgorithm");
8
9 // do some part of the algorithm here
10
11 // step1 goes here
12 Console.WriteLine("In Algorithm - DoAlgoStep1");
13 // . . .
14
15 // step 2 goes here
16 Console.WriteLine("In Algorithm - DoAlgoStep2");
17 // . . .
18
19 // Now call configurable/replacable part
20 DoAlgoStep3();
21
22 // step 4 goes here
23 Console.WriteLine("In Algorithm - DoAlgoStep4");
24 // . . .
25
26 // Now call next configurable part
27 DoAlgoStep5();
28 }
29
30 virtual public void DoAlgoStep3()
31 {
32 Console.WriteLine("In Algorithm - DoAlgoStep3");
33 }
34
35 virtual public void DoAlgoStep5()
36 {
37 Console.WriteLine("In Algorithm - DoAlgoStep5");
38 }
39 }
40
41 class CustomAlgorithm : Algorithm
42 {
43 public override void DoAlgoStep3()
44 {
45 Console.WriteLine("In CustomAlgorithm - DoAlgoStep3");
46 }
47
48 public override void DoAlgoStep5()
49 {
50 Console.WriteLine("In CustomAlgorithm - DoAlgoStep5");
51 }
52 }
53
54 /// <summary>
55 /// Summary description for Client.
56 /// </summary>
57 public class Client
58 {
59 public static int Main(string[] args)
60 {
61 CustomAlgorithm c = new CustomAlgorithm();
62
63 c.DoAlgorithm();
64
65 return 0;
66 }
67 }
模板方法