定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤,通俗来讲就是流程固定,具体实现不同
使用场景
多个子类有公有的方法,并且逻辑基本相同
重要、重复的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
重构时,模板方法模式是一个经常使用的模式,把共同的代码抽取到父类中,然后通过钩子函数约束其行为
关键点
一个抽象类,定义一套算法框架或者说是执行流程
一个或多个实现类
实现
以登录一个计算机为例(开电源、硬件检查、载入操作系统、登录)
/**
* 抽象类—定义一套算法框架
*/
public class AbsComputer {
protected void powerOn() {
Log.i(getClass().getSimpleName(), "开启电源");
}
protected void checkHardware() {
Log.i(getClass().getSimpleName(), "硬件检查");
}
protected void loadOS() {
Log.i(getClass().getSimpleName(), "载入操作系统");
}
protected void login() {
Log.i(getClass().getSimpleName(), "登录");
}
/**
* 开启流程
*/
public final void startComputer() {
powerOn();
checkHardware();
loadOS();
login();
}
}
/**
* 程序员登录计算机
*/
public class CoderComputer extends AbsComputer {
@Override
protected void login() {
Log.i(getClass().getSimpleName(),"身份密码识别");
}
}
/**
* 军用计算机
*/
public class MilitaryComputer extends AbsComputer {
@Override
protected void checkHardware() {
super.checkHardware();
Log.i(getClass().getSimpleName(), "检查防火墙");
}
@Override
protected void login() {
super.login();
Log.i(getClass().getSimpleName(), "进行指纹识别、人脸识别等复杂身份验证");
}
}
使用
AbsComputer computer = new MilitaryComputer();
computer.startComputer();
结果
01-18 22:33:50.891 12143-12143/com.example.admin.singleinstancedemo I/MilitaryComputer: 开启电源
01-18 22:33:50.891 12143-12143/com.example.admin.singleinstancedemo I/MilitaryComputer: 硬件检查
01-18 22:33:50.891 12143-12143/com.example.admin.singleinstancedemo I/MilitaryComputer: 检查防火墙
01-18 22:33:50.891 12143-12143/com.example.admin.singleinstancedemo I/MilitaryComputer: 载入操作系统
01-18 22:33:50.891 12143-12143/com.example.admin.singleinstancedemo I/MilitaryComputer: 登录
01-18 22:33:50.891 12143-12143/com.example.admin.singleinstancedemo I/MilitaryComputer: 进行指纹识别、人脸识别等复杂身份验证
小结
模板方法模式将某个固定的流程封装到一个final方法中,并且让子类能够定制这个流程中的某些或者所有步骤,这样就要求父类提取了共有的代码,提高了代码的复用率,同时也带来了更好的可扩展性。
优点
封装不变部分,扩展可变部分
提取公共代码部分,便于维护
缺点
模板方法会带来代码阅读的难度