设计模式之:模板方法
介绍
先定义虚方法,搭建行为骨架,子类继承后重写父类方法,到达重定义某些算法步骤的目的。
情景假设
守护在佛寺山门前二位金刚哼哈二将郑伦陈奇,一个鼻子里哼出白气,一个口中哈出黄气,发出来的声音足可让大地震动,让山河倾覆。如果让这两位的能力体现在代码世界里会是怎样?常规的写法就简单了:定义出这两人出来,然后在写上他们的能力,简单粗暴:
1 /// <summary> 2 /// 郑伦 3 /// </summary> 4 public class ZhengLun 5 { 6 public void Heng() 7 { 8 Console.WriteLine("哼"); 9 } 10 } 11 /// <summary> 12 /// 陈奇 13 /// </summary> 14 public class ChenQi 15 { 16 public void Ha() 17 { 18 Console.WriteLine("哈"); 19 } 20 }
1 static void Main(string[] args) 2 { 3 ZhengLun zheng=new ZhengLun(); 4 zheng.Heng(); 5 6 ChenQi chen=new ChenQi(); 7 chen.Ha(); 8 9 Console.ReadKey(); 10 }
一开始这么写也没什么不对,假如你就将这样的代码用在系统上,但到后期的时候,突然需求变更,哼哈二将要退出历史舞台了,换哪咤和二郎神来,怎么办?要命的还是来改代码的是个新手,一脸懵懂地边删边改,不知道哪咤是要守护佛门的还是准备喷火烧烤,二郎神是来遛狗还是开天眼偷窥。,如果没有一个规范给他,保不准会写出什么鬼来。模板方法就是要求定义出这种规范,抽象出公共的部分,搭建基础的行为骨架,让子类继承后重写骨架中的某些方法,这样子类就可以保证在规范的行为下,展现出自己的能力。
代码实例
1 public class Protector 2 { 3 /// <summary> 4 /// 守卫佛门 5 /// </summary> 6 public void Guard() 7 { 8 Console.WriteLine(Ability()); 9 } 10 /// <summary> 11 /// 能力 12 /// </summary> 13 /// <returns></returns> 14 protected virtual string Ability() 15 { 16 return ""; 17 } 18 } 19 20 /// <summary> 21 /// 郑伦 22 /// </summary> 23 public class ZhengLun : Protector 24 { 25 protected override string Ability() 26 { 27 return "哼"; 28 } 29 } 30 /// <summary> 31 /// 陈奇 32 /// </summary> 33 public class ChenQi : Protector 34 { 35 protected override string Ability() 36 { 37 return "哈"; 38 } 39 } 40 /// <summary> 41 /// 杨戬 42 /// </summary> 43 public class YangJian : Protector 44 { 45 protected override string Ability() 46 { 47 return "天眼"; 48 } 49 } 50 /// <summary> 51 /// 哪咤 52 /// </summary> 53 public class NaZha : Protector 54 { 55 protected override string Ability() 56 { 57 return "喷火"; 58 } 59 }
1 static void Main(string[] args) 2 { 3 4 Protector yangjian=new YangJian(); 5 yangjian.Guard(); 6 7 8 Protector nazha = new NaZha(); 9 nazha.Guard(); 10 11 Console.ReadKey(); 12 }
首先定义出一个守护者的父类出来,为这个守护者定义出守护佛门的方法和展现能力的虚方法,让各天神继承这个守护者后,重新虚方法。这样一来,各天神既可以展现自己的能力,又让自己的能力规范的守护佛门的重任上,让其他僭越的行为关在笼子里,这就是模版方法模式的作用。
总结
我们在选择设计模式的时候,最重要的是看清楚自己的需求变化点在哪里,不能变的又在哪里,只有知道自己的变化点在哪里才知道哪个模式合适自己。
在上面的例子中,要完成的事情其实就是守护佛门这个重任,这个不能变的,不过换谁都一样。而变化的地方是还换不同的天神来守,不同的天神会有他自己的能力表现。那么我们在描述的时候,会首先确定守护者这个职责和守护的行为,然后像制定制度一样规定下来,不管之后是谁来继承这个职责,有怎样的能力,他都必须是以完成保护者的使命而出现。所以模版方法就是保证职责的前提下,允许改变它的实现方式。