设计模式之:模板方法


介绍

      先定义虚方法,搭建行为骨架,子类继承后重写父类方法,到达重定义某些算法步骤的目的。

情景假设

  守护在佛寺山门前二位金刚哼哈二将郑伦陈奇,一个鼻子里哼出白气,一个口中哈出黄气,发出来的声音足可让大地震动,让山河倾覆。如果让这两位的能力体现在代码世界里会是怎样?常规的写法就简单了:定义出这两人出来,然后在写上他们的能力,简单粗暴:

 

 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         }

 

 

   首先定义出一个守护者的父类出来,为这个守护者定义出守护佛门的方法和展现能力的虚方法,让各天神继承这个守护者后,重新虚方法。这样一来,各天神既可以展现自己的能力,又让自己的能力规范的守护佛门的重任上,让其他僭越的行为关在笼子里,这就是模版方法模式的作用。

    

总结

   我们在选择设计模式的时候,最重要的是看清楚自己的需求变化点在哪里,不能变的又在哪里,只有知道自己的变化点在哪里才知道哪个模式合适自己。

    在上面的例子中,要完成的事情其实就是守护佛门这个重任,这个不能变的,不过换谁都一样。而变化的地方是还换不同的天神来守,不同的天神会有他自己的能力表现。那么我们在描述的时候,会首先确定守护者这个职责和守护的行为,然后像制定制度一样规定下来,不管之后是谁来继承这个职责,有怎样的能力,他都必须是以完成保护者的使命而出现。所以模版方法就是保证职责的前提下,允许改变它的实现方式。

posted @ 2017-02-24 17:41  蜗牛爬行  阅读(91)  评论(0)    收藏  举报