动机(Motivation)
在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?
意图(Intent)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
结构(Structure)
代码实现:
1 //框架开发者-先开发 2 public abstract class Vehicle 3 { 4 protected abstract void Run(); 5 protected abstract void StartUp(); 6 protected abstract void Turn(int degree); 7 protected abstract void Stop(); 8 9 public void Test() 10 { 11 StartUp();//晚绑定,留给应用程序员绑定,扩展开发 12 Run(); 13 Turn(90); 14 Stop(); 15 } 16 } 17 18 public class VehicleTestFramework 19 { 20 private Vehicle vehicle; 21 public VehicleTestFramework(Vehicle vehicle) 22 { 23 this.vehicle = vehicle; 24 } 25 public void DoTest() 26 { 27 vehicle.Test(); 28 } 29 }
1 //应用程序开发人员,后开发 2 class HongqiVehicle:Vehicle 3 { 4 protected override void Run() 5 { 6 Console.WriteLine("红旗汽车在运行"); 7 } 8 9 protected override void StartUp() 10 { 11 Console.WriteLine("红旗汽车已开启"); 12 } 13 14 protected override void Turn(int degree) 15 { 16 Console.WriteLine("红旗汽车在转向了{0}度",degree); 17 } 18 19 protected override void Stop() 20 { 21 Console.WriteLine("红旗汽车以停止"); 22 } 23 }
Template Method模式的几个要点:
Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基础实现结构。
除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将他们设置为protected方法。