你是否正在寻找关于head first设计模式的内容?让我把最有价值的东西奉献给你:

一、模板方法模式定义
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
从定义中,应该可以看出一部分,为了更好理解,下面就直接上例子:
二、模板方法例子在敲代码时,累了喝杯咖啡或者喝杯茶,会精神倍增。其实无论咖啡还是茶在冲的时间都是有讲究的。这个在本文不是重点。下面分别描述一下冲泡咖啡和冲泡茶的过程:

两种茶其分别的做法如下代码:
Coffee 2 { PrepareRecipe() 4 { BoilWater(); BrewCoffeeGrinds(); PourInCup(); AddSugarAndMilk(); 13 } BoilWater() 15 { ); 17 } BrewCoffeeGrinds() 20 { ); 22 } PourInCup() 25 { ); 27 } AddSugarAndMilk() 30 { ); 32 } 33 } Tea 36 { PrepareRecipe() 38 { BoilWater(); SteepTeaBag(); PourInCup(); AddLemon(); 47 } BoilWater() 49 { ); 51 } SteepTeaBag() 54 { ); 56 } PourInCup() 59 { ); 61 } AddLemon() 64 { ); 66 } 67 }
View Code在面向对象语言中,是要讲求复用的,现在烧水和带入杯子的方法显然是重复的,这样就不符合对象村的村规——复用。
对比两种做法,都是需要四个步骤,能不能把相同的使用一个基类,不同的部分分别由自己的去实现。其类图如下

如果再细致观察的话,我们的冲咖啡和泡茶以及加入咖啡和牛奶都是属于差不多动作相同的。所以可以继续抽象,抽象后的方法大致如此:

其实得出的也就是我们的模板方法。下面来看看模板方法模式的类图:
三、模板方法类图

从类图可以看到我们把共用的方法放在抽象类中,用于复用。把不确定的方法,放入到具体类中,以便让具体类可以很好的构造自己的方法。除此之外,还有个重点是无论是构造好的方法也好,还是抽象的方法也好,都会被装入到一个TemplateMethod方法中。就像我们平时的做项目也是如此,大致的步骤需要:需求分析——>编码——>测试,这些最基本的过程。但是具体的每一步,可能都是不同的,但是做项目的过程的几个步骤是基本不变的,把步骤抽象成了模板,以后做项目的时间,都按这个步骤去做。这个就是我们的模板方法模式。到这里还是把我们的茶和咖啡沏好。
基类代码:
CoffeeinBeverage1 { public void BoilWater() { Console.WriteLine(); } public void PrepareRecipe() { BoilWater(); Brew(); PourInCup(); AddCondiments(); } public void PourInCup() { Console.WriteLine(); } Brew(); AddCondiments(); }
咖啡代码:
public class Coffee1 : CoffeeinBeverage1 { Brew() { Console.WriteLine(); } AddCondiments() { Console.WriteLine(); }
茶代码:
public class Tea1 : CoffeeinBeverage1 { Brew() { Console.WriteLine(); } AddCondiments() { Console.WriteLine(); } }
四、模板方法注意的问题在上面的茶水和咖啡中,现在是看起来能喝了,但是有个问题就是有些人喝咖啡喜欢不加任何调味料的。那么我们硬是给客人加,肯定是会生气的。为了满足这个要求,设计模式提供的有这个解决方案——使用钩子。具体什么是钩子,我们小的时间的课本上有个猴子捞月亮的图片:

每个猴子不仅会被其他猴子拉住,还会伸出一个手去拉其他猴子。但最后一个手是没有拉其他猴子了,但是还是要伸下去的,以防碰不到月亮。
同样不知道方法能不能用得到,但是有对应的方法,具体的什么时间用得到,什么时间用不到,根据条件来判断。
下面来看看钩子如何在模板方法模式中使用的:
基类代码:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shenmilingyu/article-8632-1.html
因为下—次来的胡朋狗友二流子比这一次多的多
加表情什么鬼