模板方法模式
定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤.
使用场景:
- 多个子类有公有的方法,而且逻辑基本相同时.
- 重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现.
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,庵后通过函数约束其行为.
优点: 封装不变部分,扩展可变部分. 提取公共部分代码,便于维护.
缺点: 模板方法会带来代码阅读的难度,会让用户觉得难以理解.
举个例子:
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("小白的计算机不需要登录,直接进入系统");
}
public final void startUp(){
System.out.println("==========开机 START======");
powerOn();
checkHardware();
loadOS();
login();
System.out.println("==========关机 END========");
}
}
public class CoderComputer extends AbstractComputer{
@Override
protected void login() {
System.out.println("程序员需要用户名密码匹配才能进入");
}
}
public class MilitaryComputer extends AbstractComputer{
@Override
protected void login() {
System.out.println("进行指纹识别等复杂的用户验证");
}
@Override
protected void checkHardware() {
super.checkHardware();
System.out.println("检测硬件防火墙");
}
}
client 端使用:
public static void main(String[] args) {
AbstractComputer computer = new MilitaryComputer();
computer.startUp();
}
运行结果:
==========开机 START======
开启电源
硬件检测
检测硬件防火墙
载入操作系统
进行指纹识别等复杂的用户验证
==========关机 END========
通过例子可以看到,在startUp 方法中有一些固定的步骤,依次是开启电源,检查硬件,加载系统,用户登录4个步骤,这个4个步骤是计算机开机过程不会变动, 但是不同用户的这几个步骤的实现可能各不相同,因此,子类需要复写相应的方法来进行自定义处理. 子类只能修改某一个步骤的具体实现,但是流程不会改变,这个就保证了逻辑流程的稳定性.这就是模板方法模式.