模板方法模式定义
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。)
模板方法模式成员
抽象类 & 实现类
public abstract class AbstractClass {
// 基本方法 建议使用protected修饰
protected abstract void doSomething1();
protected abstract void doSomething2();
// 模板方法 建议使用final修饰
public final void templateMethod() {
this.doSomething1();
this.doSomething2();
}
}
public class Class1 extends AbstractClass {
@Override
protected void doSomething1() {
// 处理业务逻辑
}
@Override
protected void doSomething2() {
// 处理业务逻辑
}
}
public class Class2 extends AbstractClass {
@Override
protected void doSomething1() {
// 处理业务逻辑
}
@Override
protected void doSomething2() {
// 处理业务逻辑
}
}
调用者
public class Client {
public static void main(String[] args) {
AbstractClass class1 = new Class1();
AbstractClass class2 = new Class2();
class1.templateMethod();
class2.templateMethod();
}
}
模板方法模式优点
- 封装不变部分,扩展可变部分
- 提取公共部分代码,便于维护
- 行为由父类控制,子类实现
模板方法模式缺点
- 子类的执行结果影响了父类的执行结果,提升代码阅读的复杂度
- 抽象类的模板方法定义了方法调用顺序,该顺序不好调整
模板方法模式扩展
由于抽象类的模板方法不建议被重写,若Class1的执行需要跳过调用doSomething1方法,则需要做如下修改:
- AbstractClass添加needDoSomething1方法,用于控制doSomething1方法的调用
- 修改AbstractClass的templateMethod方法逻辑
- Class1重写doSomething1方法
public abstract class AbstractClass {
// 基本方法 建议使用protected修饰
protected abstract void doSomething1();
protected abstract void doSomething2();
// 模板方法 建议使用final修饰
public final void templateMethod() {
if (this.needDoSomething1()) {
this.doSomething1();
}
this.doSomething2();
}
// 控制doSomething1方法的调用
protected boolean needDoSomething1() {
return true;
}
}
public class Class1 extends AbstractClass {
@Override
protected void doSomething1() {
// 处理业务逻辑
}
@Override
protected void doSomething2() {
// 处理业务逻辑
}
// 需要跳过doSomething1方法的子类,重写该方法
@Override
protected boolean needDoSomething1() {
return false;
}
}
public class Class2 extends AbstractClass {
@Override
protected void doSomething1() {
// 处理业务逻辑
}
@Override
protected void doSomething2() {
// 处理业务逻辑
}
}