定义
定义一个操作中的算法框架,而将一些步骤延迟到子类中吗,让子类可以不改变算法的结构的既可以重定义该算法的特定步骤
使用场景
1.一个子类有共有的方法,并且逻辑基本相同
2.重要,复杂的算法可以把核心算法设计为一个模板方法,周边的相关细节功能由各个子类去实现
3.重构的时候,模板方法模式是一个经常使用的模式,吧相同的代码抽取到父类中,然后通过钩子函数约束行为
UML图
AbsTemplate定义了一个算法框架
ConcreteImplA 具体实现类A
ConcreteImplB 具体实现类B
代码实现
public abstract class AbstractComputer {
protected void powerOn() {
System.out.println("开启电源");
}
protected void checkHardware() {
System.out.println("硬件检查");
}
protected void loadOs() {
System.out.println("载入操作系统");
}
protected void login() {
System.out.println("小白的计算机,不需要密码直接进入");
}
protected void startUp() {
System.out.println("开机 start");
powerOn();
checkHardware();
loadOs();
login();
System.out.println("开机结束 end");
}
}
public class CoderComputer extends AbstractComputer {
@Override
protected void login() {
super.login();
System.out.println("程序员只需要进行用户和密码验证就可以了");
}
}
public class MilitartyComputer extends AbstractComputer {
@Override
protected void login() {
super.login();
System.out.println("进行指纹识别等复杂的用户验证");
}
@Override
protected void checkHardware() {
super.checkHardware();
System.out.println("检查硬件的防火墙");
}
}
模板方法模式用四个字概括就是:流程封装,也就是把某个固定的流程封装到一个final方法,并且让子类能定制这个流程中的某些方法或者步骤,这就要求提取公共的代码,提升代码的复用率,同事也带来更好的可扩展性。
优点
封装部分不变的,扩展可变的,提取公共的部分代码,便于维护
缺点
模板方法会带来代码的阅读性的难度,会让用户觉得难以理解