概述

模板方法是通过定义一个算法骨架,而将算法中的步骤延迟到子类,这样子类就可以复写这些步骤的实现来实现特定的算法。
同时由于父类定义好了算法的步骤,只是在某几个固定的点才回调用到被之类实现的方法,所以也就只允许在几个点类扩展功能。
从实现角度来看:模板方法主要通过制定模板,把算法步骤固定下来。至于谁来实现,模板可以自己提供,也可以子类去实现,还可以通过回调让其他类来实现。

在模板里面包含如下几类方法:

  • 模板方法:用于定义算法的框架。
  • 具体方法:在模板中直接实现某些步骤的方法,通常这些步骤的实现算法是固定的,而且是不怎么变化的,因此可以将其当做公共功能实现在模板中,如果不需要为子类提供访问这些方法的话,可以将这些方法定义为privete,如果是提供给子类访问的,可以吧这些方法定义为protected final,从而避免子类对这些方法的复写。
  • 原语操作,在模板中定义的抽象操作,通常是模板方法需要调用的操作,而且这些操作在父类中还没有办法确定下来。需要子类来实现真正的方法。
  • 回调方法:通过回调机制来调用其他类中的方法。
  • 工厂方法,在模板方法中如果需要得到某些对象的实例的话,可以考虑通过工厂方法来获取,把具体的创建对象延迟到子类中去。
public abstract class TempleClass {
private void stepOne() {
System.out.println("This is step One from TempleClass");
}
protected void stepTwo() {
System.out.println("This is step Two will be call by Child Temple with Overwrite");
}
protected final void stepThree() {
System.out.println("This is step Three will be call by Child Temple without Overwrite");
}
protected abstract void TempleMethodOne();
protected abstract void TempleMethodTwo();
public void temple(HookCallBack callback){
stepOne();
stepTwo();
stepThree();
TempleMethodOne();
TempleMethodTwo();
callback.methodFromHook();
}
}
public interface HookCallBack {
public void methodFromHook();
}
public class ChildTempleClassOne extends TempleClass {
protected void stepTwo() {
System.out.println("This is from ChildTempleClassOne");
}

protected void TempleMethodOne() {
System.out.println("This is from ChildTempleClassOne TempleMethodOne");
}
protected void TempleMethodTwo() {
System.out.println("This is from ChildTempleClassOne TempleMethodTwo");
}
}
public class ChildTempleClassTwo extends TempleClass {
protected void stepTwo() {
System.out.println("This is from ChildTempleClassTwo");
}
protected void TempleMethodOne() {
System.out.println("This is from ChildTempleClassTwo TempleMethodOne");
}
protected void TempleMethodTwo() {
System.out.println("This is from ChildTempleClassTwo TempleMethodTwo");
}
}
public class Client {

public static void main(String args[]){
TempleClass temple1 = new ChildTempleClassOne();
TempleClass temple2 = new ChildTempleClassTwo();
temple1.temple(new HookCallBack() {
public void methodFromHook() {
System.out.println("This is from HookCallBack from temple1");
}
});

temple2.temple(new HookCallBack() {
public void methodFromHook() {
System.out.println("This is from HookCallBack from temple2");
}
});
}
}
Contents
  1. 1. 概述
  2. 2. 在模板里面包含如下几类方法: