模板方法模式利用了Java的继承机制。先上UML图:
模板方法模式UML
public abstract class Template {
public abstract void methodOne();
public abstract void methodTwo();
// 模板方法
public void commonMethod() {
this.methodOne();
this.methodTwo();
}
}
具体类
public class ConcreteA extends Template {
@Override
public void methodOne() {
System.out.println("AOne");
}
@Override
public void methodTwo() {
System.out.println("ATwo");
}
}
public class ConcreteB extends Template {
@Override
public void methodOne() {
System.out.println("BOne");
}
@Override
public void methodTwo() {
System.out.println("BTwo");
}
}
客户端类
public class Client {
public static void main(String[] args) {
Template templateA = new ConcreteA();
templateA.commonMethod(); // AOne \n\r ATwo
Template templateB = new ConcreteB();
templateB.commonMethod(); // BOne \n\r BTwo
}
}
模板方法扩展
可以在抽象父类的模板方法commonMethod
内,根据普通方法的返回结果做流程控制,比如:
public abstract class Template {
public abstract void methodOne();
public abstract void methodTwo();
public abstract boolean doMethodOne();
// 模板方法
public void commonMethod() {
if (this.doMethodOne()) {
this.methodOne();
}
this.methodTwo();
}
}
使用Java8的接口默认方法
Java8以后,接口新增了默认方法,也可用于实现模板方法模式。不一定要用抽象类。