简介
定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现,模板方法可以使子类在不改变算法结构的情况下,重新定义算法的某些步骤,也可以通过钩子方法来特殊处理逻辑,该模式属于行为型。
适用场景
1、一次性实现一个算法不可变的部分,并将可变的部分留给子类来实现
2、各子类中公共的部分被提取出来到公共的父类中,避免重复的代码
优点
1、提高复用性
2、提高扩展性
3、符合开闭原则
缺点
1、类个数增加
2、增加系统实现的复杂性
3、继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要修改
扩展
钩子方法
可以通过钩子方法来做一些细微的调整,从而实现不一样的功能。
代码示例
抽象类,定义了固定的算法,就是打开冰箱,放东西,关闭冰箱,有时候有些东西需要进行打包,预留了钩子方法来判断是否需要打包,默认是不打包的。
public abstract class AFridgeFrozen {
protected final void fridgeFrozen(){
openFridge();
if(needPackThing()){
packThing();
}
putThings();
closeFridge();
}
final void openFridge(){
System.out.println("打开冰箱门");
}
/**
* 放东西不一样
*/
abstract void putThings();
final void closeFridge(){
System.out.println("关闭冰箱门");
}
final void packThing(){
System.out.println("对放入的东西进行打包");
}
/**
* 钩子方法,需要的子类自己实现
*/
protected boolean needPackThing(){
return false;
}
}
保鲜鸡蛋类
public class FridgeFrozenAgg extends AFridgeFrozen {
@Override
void putThings() {
System.out.println("放鸡蛋");
}
}
保鲜西瓜,需要进行打包
public class FridgeFrozenHalfWatermelon extends AFridgeFrozen {
@Override
void putThings() {
System.out.println("放一半西瓜");
}
@Override
protected boolean needPackThing() {
return true;
}
}
测试类
public class TemplateMethodTest {
public static void main(String[] args) {
AFridgeFrozen fridgeFrozen = new FridgeFrozenAgg();
fridgeFrozen.fridgeFrozen();
System.out.println("--------------华丽的分割线---------------------");
AFridgeFrozen watermelon = new FridgeFrozenHalfWatermelon();
watermelon.fridgeFrozen();
}
}
输出结果
打开冰箱门
放鸡蛋
关闭冰箱门
--------------华丽的分割线---------------------
打开冰箱门
对放入的东西进行打包
放一半西瓜
关闭冰箱门
源码分析
jdk中应用
AbstractList
类中的方法
这里的方法没有final,所以子类也是可以自己定义逻辑的。
servlet中应用
HttpServlet
类里面有doXXX方法,表示不同的操作,service组合了doXXX方法。
mybatis中应用
BaseExecutor
定义了一个算法方法
以下方法由子类来实现
由这几个子类继承了BaseExecutor
抽象类
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载