一、定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
父类建立框架,子类在重写了父类部分的方法后,再调用从父类继承的方法,产生不同的结果(而这正是模板方法模式)。
优点:
- 封装不变部分,扩展可变部分。
- 提取公共部分代码,便于维护
- 行为由父类控制,子类实现,子类可通过扩展的方式增加相应的功能。
缺点:
抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果也就是子类对父类产生了影响,这在复杂项目中,会带来代码阅读的难度。
二、实现
public class Client {
public static void main(String[] args) {
AbstractClass class1 = new ConcreteClass1();
AbstractClass class2 = new ConcreteClass2();
//调用模板方法
class1.templateMethod();
class2.templateMethod();
}
}
abstract class AbstractClass {
//基本方法(基本方法尽量设计为protected类型)
protected abstract void doSomething();
//基本方法
protected abstract void doAnything();
//模板方法(模板方法最好加上final关键字,不允许被覆写,防止恶意操作。)
public final void templateMethod(){
//调用基本方法,完成相关的逻辑
this.doAnything();
this.doSomething();
}
}
class ConcreteClass1 extends AbstractClass {
//实现基本方法
protected void doAnything() {
//业务逻辑处理
}
protected void doSomething() {
//业务逻辑处理
}
}
class ConcreteClass2 extends AbstractClass {
//实现基本方法
protected void doAnything() {
//业务逻辑处理
}
protected void doSomething() {
//业务逻辑处理
}
}
tips: 外界条件改变,影响到模板方法的执行。在抽象类中,可以新增一个Boolean值。通过isXXX()的返回值就是影响了模板方法的执行结果,该方法就叫做钩子方法(Hook Method)。有了钩子方法模板方法模式才算完美,由子类的一个方法返回值决定公共部分的执行结果。
网友评论