定义
Define the skeleton of an algorithm in an operation , deferring some steps to subclass. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’ s structure.
使用场景
- 多个子类公有的方法,且逻辑基本相同时。
- 重要、复杂的算法,可以将核心算法设计为模板方法,周边相关细节功能由各子类实现。
UML
示例
抽象模板类
public abstract class AbstractClass {
protected abstract void method1();
protected abstract void method2();
/**
* 为防止恶意操作,模板方法禁止覆写
*/
public final void templateMethod(){
method1();
method2();
}
}
具体模板类
public class ConcreteClass1 extends AbstractClass{
@Override
protected void method1() {
System.out.println("ConcreteClass1 method1");
}
@Override
protected void method2() {
System.out.println("ConcreteClass1 method2");
}
}
场景类
public class Client {
public static void main(String[] args){
AbstractClass abstractClass1 = new ConcreteClass1();
abstractClass1.templateMethod();
}
}
优点
- 封装不变部分,扩展可变部分
- 提取公共部分,便于维护
- 行为由父类控制,由子类实现
局限
- 子类对父类产生类影响,带来代码阅读的难度
扩展
钩子方法
public abstract class AbstractClass {
protected abstract void method1();
protected abstract void method2();
/**
* 为防止恶意操作,模板方法禁止覆写
*/
public final void templateMethod(){
method1();
if(hookMethod())
method2();
}
/**
* 钩子方法
*/
protected boolean hookMethod(){
return true;
}
}
具体模板类
public class ConcreteClass1 extends AbstractClass {
private boolean isHook;
@Override
protected void method1() {
System.out.println("ConcreteClass1 method1");
}
@Override
protected void method2() {
System.out.println("ConcreteClass1 method2");
}
public void setHook(boolean hook) {
isHook = hook;
}
@Override
protected boolean hookMethod() {
return isHook;
}
}
场景类
public class Client {
public static void main(String[] args){
ConcreteClass1 concreteClass1 = new ConcreteClass1();
concreteClass1.setHook(true);
concreteClass1.templateMethod();
}
}
END ~