前言
模板方法模式(TemplateMethod):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
一、模板结构
AbstractClass是抽象类,其实也就是抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
1 public abstract class AbstractClass
2 {
3 //一些抽象行为,放到子类去实现
4 public abstract void Operation1();
5 public abstract void Operation2();
6 //模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类实现
7 public void TemplateMethod()
8 {
9 Operation1();
10 Operation2();
11 }
12 }
ConcreteClass实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个 ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现不同。
1 public class ConcreteClassA : AbstractClass
2 {
3 public override void Operation1()
4 {
5 Console.WriteLine("具体类A方法1实现");
6 }
7
8 public override void Operation2()
9 {
10 Console.WriteLine("具体类A方法2实现");
11 }
12 }
13 public class ConcreteClassB : AbstractClass
14 {
15 public override void Operation1()
16 {
17 Console.WriteLine("具体类B方法1实现");
18 }
19
20 public override void Operation2()
21 {
22 Console.WriteLine("具体类B方法2实现");
23 }
24 }
客户端代码
1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 AbstractClass c;
7 c = new ConcreteClassA();
8 c.TemplateMethod();
9
10 c = new ConcreteClassB();
11 c.TemplateMethod();
12
13 Console.ReadKey();
14 }
15 }
二、例子
考试试卷类,有两个题目方法,并通过虚方法打印结果,而虚方法也就是答案放在各自学生子类去实现
1 public class TestPaper
2 {
3 public void TestQ1()
4 {
5 Console.WriteLine("小明:吃饭了吗?小白:吃你大爷!");
6 Console.WriteLine("Q:小明吃饭了吗?");
7 Console.WriteLine("a.吃你大爷 b.没有 c.吃了 d.一块吃了");
8 //改成一个虚方法
9 Console.WriteLine("答案:" + Answer1());
10 }
11 public void TestQ2()
12 {
13 Console.WriteLine("小花:他奶奶的,老娘居然来大姨妈了!");
14 Console.WriteLine("Q:谁来大姨妈了");
15 Console.WriteLine("a.小花 b.小花他奶奶 c.小花他老娘 d.大姨妈");
16 Console.WriteLine("答案:" + Answer2());
17 }
18 //虚方法的目的就是给继承的子类重写,因为这里每个人的答案都是不同的
19 protected virtual string Answer1()
20 {
21 return "";
22 }
23 protected virtual string Answer2()
24 {
25 return "";
26 }
27 }
学生A和学生B的答案
1 //学生A的试卷
2 public class TestPaperA : TestPaper
3 {
4 protected override string Answer1()
5 {
6 return "b";
7 }
8 protected override string Answer2()
9 {
10 return "c";
11 }
12 }
13 //学生A的试卷
14 public class TestPaperB : TestPaper
15 {
16 protected override string Answer1()
17 {
18 return "a";
19 }
20 protected override string Answer2()
21 {
22 return "d";
23 }
24 }
客户端实现:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Console.WriteLine("学生A的试卷");
6 TestPaper a = new TestPaperA();
7 a.TestQ1();
8 a.TestQ2();
9 Console.WriteLine("==================");
10 Console.WriteLine("学生B的试卷");
11 TestPaper b = new TestPaperB();
12 b.TestQ1();
13 b.TestQ2();
14
15 Console.ReadKey();
16 }
17 }
总结:
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法模式就提供了一个很好的代码复用平台。
参考书籍:大话设计模式