Java与模式之模板方法(Template Method)模式

    模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象的方法迫使子类实现剩余的逻辑。不同的子类可以有不同的实现,这是模板方法的用意。而我认为其精髓在于在抽象类中定义的模板方法,此方法为抽象类中其他方法的一个有序的汇总。

   模板方法模式的静态结构如下图所示:

 

   这里涉及到2个角色:

   抽象模板角色有如下责任:

  1. 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是顶级逻辑的组成部分。
  2. 定义并实现了一个模板方法。它给出了一个顶级逻辑的骨架,而逻辑的部分组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体的方法。

   具体模板角色有如下责任:

  1. 实现了父类定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。   
  2. 每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。

    示意性源码如下:

    首先抽象模板角色提供了一个具体的方法(也即所谓的模板方法) TemplateMethod(),此方法按一定顺序调用了其他方法(包括抽象方法和具体方法)

public abstract class AbstractClass {
	/**
	 * 模板方法
	 */
	public void TemplateMethod(){
		//  调用基本方法(由子类实现)
		doOperation1();
		//  调用基本方法(已实现)
		doOperation3();
		//  调用基本方法(由子类实现)
		doOperation2();
	}
	/**
	 * 基本方法声明,由子类实现
	 */
	protected abstract void doOperation1();
	/**
	 * 基本方法,已实现
	 */
	private void doOperation3(){
		System.out.println("doOperation3()");
		// do somethings
	}
	/**
	 * 基本方法声明,由子类实现
	 */
	protected abstract void doOperation2();
}
 

    显然doOperation1(),doOperation2()等基本方法是模板方法的组成部分,抽象模板自己并不给出这些抽象方法的实现,而是把这些方法交给子类去实现。

public class ConcreteClass extends AbstractClass {
	/**
	 * 基本方法的实现
	 */
	@Override
	protected void doOperation1() {
		// do somethings
		System.out.println("doOperation1()");

	}
	/**
	 * 基本方法的实现
	 */
	@Override
	protected void doOperation2() {
		// do somethings
		System.out.println("doOperation2()");
	}
}
 

   这个具体模板角色实现了父类所声明的抽象方法doOperation1(),doOperation2(),而这2个方法的代表的就是强制子类实现的剩余逻辑

模板方法模式的应用

    HttpServlet技术是建立在模板方法模式的基础之上的。HttpServlet类提供了一个service()方法。这个方法调用了7个do方法中的一个或几个,完成对客户端调用的处理。这些do方法则要求由具体的子类来实现。在这里service()方法便是模板方法,7个do方法便是基本方法。因HttpServlet对7个do方法都提供了默认实现,所以子类只是选择性的覆盖这些do方法而已,最常见的是覆盖doGet(),doPost()方法,这样每个子类就可以实现自己的业务逻辑。

参考书籍:Java与模式

猜你喜欢

转载自zhdkn.iteye.com/blog/1703406