动机:在软件构建过程当中,对于某一项任务,他经常有稳定的总体操做结构,但各个子步骤却有不少改变的需求,或者因为固有的缘由(好比框架与应用之间的关系)而没法和任务的总体结构同时实现;如何在肯定稳定操做结构的前提下,来灵活应对各类子步骤的变化或者晚期实现需求?算法
意图:定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod是的子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。框架
适用性:ide
一、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。测试
二、各子类中公共的行为应被提取出来并集中到一个公共父类中以免代码重复。这是O p d y k e 和J o h n s o n 所描述过的“重分解以通常化”的一个很好的例子[ O J 9 3 ]。首先识别现有代码中的不一样之处,而且将不一样之处分离为新的操做。最后,用一个调用这些新的操做的模板方法来替换这些不一样的代码。spa
三、控制子类扩展。模板方法只在特定点调用“h o o k ”操做,这样就只容许在这些点进行扩展。设计
UML图解:code
示例:假设要开发一款汽车测试程序,而对于测试什么类型和什么牌子的汽车,都是是未知的。应用模板方法来设计,咱们就能够先把汽车测试程序测试涉及的方法列举出来,对于某些测试方法具体实现留给后来汽车厂商去实现,代码以下blog
汽车测试软件框架部分:开发
1 //汽车测试软件框架的开发组——先开发 2 namespace TemplateMethod 3 { 4 public abstract class Vehicle 5 { 6 protected abstract void Startup(); 7 protected abstract void Run(); 8 protected abstract void Turn(); 9 protected abstract void Stop(); 10 11 public void Test() 12 { 13 Startup();//晚绑定,留给应用程序开发人员实现,扩展点 14 //测试数据记录... 15 16 Run();//晚绑定,留给应用程序开发人员实现,扩展点 17 //测试数据记录... 18 19 Turn();//晚绑定,留给应用程序开发人员实现,扩展点 20 //测试数据记录... 21 22 Stop();//晚绑定,留给应用程序开发人员实现,扩展点 23 //测试数据记录... 24 } 25 } 26 27 public class VehicleTestFramework 28 { 29 public static void DoTest(Vehicle vehicle) 30 { 31 //... 32 vehicle.Test(); 33 //... 34 } 35 } 36 }
具体汽车厂商后来实现部分:event
1 //具体汽车厂商汽车测试程序程序开发组——晚开发 2 namespace TemplateMethod 3 { 4 public class DaZhongCar:Vehicle 5 { 6 protected override void Startup() 7 { 8 //... 9 } 10 11 protected override void Run() 12 { 13 //... 14 } 15 16 protected override void Turn() 17 { 18 //... 19 } 20 21 protected override void Stop() 22 { 23 //... 24 } 25 } 26 }