模板方法模式
模板方法模式结构:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace DesignMode.BehavioralPattern
8 {
9 #region 模板方法模式要点
10 //
11 //定义:在一个抽象类中定义一个操作中的算法骨架,将一些步骤延迟到子类中去实现
12 //模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤
13 //可以将不变行为搬到超类中,从而去除子类中的重复代码。
14 //
15 //使用场景:一系列类的执行过程相似,包含相同的流程和算法
16 //
17 /*
18 实现方式:
19 1.分析目标算法,确定能否将其分解为多个步骤。
20 从所有子类的角度出发,考虑哪些步骤能够通用,哪些步骤各不相同。
21
22 2.创建抽象基类并声明一个模板方法和代表算法步骤的一系列抽象方法。
23 在模板方法中根据算法结构依次调用相应步骤。
24
25 3.将所有步骤全都设为抽象类型,也可为公共方法提供默认实现,子类无需实现那些方法。
26
27 4.可考虑在算法的关键步骤之间添加钩子。钩子是内部实现为空的可选步骤。
28 即使不重写钩子,模板方法也能工作。 钩子通常放置在算法重要步骤的前后,为子类提供额外的算法扩展点。
29
30 5.为每个算法变体新建一个具体子类, 它必须实现所有的抽象步骤, 也可以重写部分可选步骤。
31
32 */
33 #endregion
34
35 public abstract class TemplatMethodPattern
36 {
37 public abstract void OperatingOne();
38 public abstract void OperatingTwo();
39 public abstract void OperatingThree();
40
41 public virtual void Hook()
42 {
43 //钩子 可由子类重写用于扩展算法
44 }
45
46 public virtual void SharedMethod()
47 {
48 Console.WriteLine("共享方法,子类可不重写,减少代码重复");
49 }
50 }
51
52
53 public class ConcreteClass : TemplatMethodPattern
54 {
55 public override void OperatingOne()
56 {
57 Console.WriteLine("ConcreteClass OperatingOne Start...");
58 }
59
60 public override void OperatingTwo()
61 {
62 Console.WriteLine("ConcreteClass OperatingTwo Start...");
63 }
64
65 public override void OperatingThree()
66 {
67 Console.WriteLine("ConcreteClass OperatingThree Start...");
68 }
69
70 public override void Hook()
71 {
72 Console.WriteLine("ConcreteClass Hook Start...");
73 }
74 }
75
76
77 public class AnotherConcreteClass : TemplatMethodPattern
78 {
79 public override void OperatingOne()
80 {
81 Console.WriteLine("AnotherConcreteClass OperatingOne Start...");
82 }
83
84 public override void OperatingTwo()
85 {
86 Console.WriteLine("AnotherConcreteClass OperatingTwo Start...");
87 }
88
89 public override void OperatingThree()
90 {
91 Console.WriteLine("AnotherConcreteClass OperatingThree Start...");
92 }
93
94 public override void Hook()
95 {
96 Console.WriteLine("AnotherConcreteClass Hook Start...");
97 }
98 }
99
100 }
浙公网安备 33010602011771号