模板方法(Template Method)模式

  如果你想只掌握一种设计模式,那非模板方法模式不可, 因为它使用太广泛了。对程序员来讲,模板方法模式随处可见, MFC程序(熟悉VC的同学一定用过)、Junit、Spring中的JDBC Template、Jmeter, 甚至大到大家天天使用的eclipse IDE。 那模板方法究竟干了些什么呢? 说白了,模板方法定义了基础结构骨架和抽象声明,而抽象声明的具体实现留到子类中去完成(这就是大名鼎鼎的回调方法)。

   GOF中对模板方法设计模式是这样描述的:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

  从上述描述中可以知道,完成这样的任务需要有抽象的方法、具体的算法骨架,所以含有protected的抽象方法和public的算法骨架方法的抽象类是最适合的。 UML图如下:

模板方法

 例子1:让我们来分析一下Junit的源代码:

在TestCase.java中对类和方法的描述如下:

public abstract class TestCase extends Assert implements Test

  1. public void runBare() throws Throwable { 
  2.         setUp(); 
  3.         try { 
  4.             runTest(); 
  5.         } 
  6.         finally { 
  7.             tearDown(); 
  8.         } 
  9.     } 

 

  1. protected void setUp() throws Exception { 
  2.     } 

 

  1. protected void tearDown() throws Exception { 
  2.     } 

   我们并不是必须要让测试程序使用这两个方法来初始化和释放资源的。如果是抽象方法,则子类们必须给它一个实现,不管用到用不到。这显然是不合理的。使用钩子方法,则你在需要的时候,可以在子类中重写这些方法。

 例子2: