模板模式
1.定义:
定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2.使用场景:
- 多个子类有公有的方法,并且逻辑基本相同时;
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各自类实现;
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
3.UML图
4.详解:
模板方法是一种行为型设计模式,它实际上是封装一个固定流程,即把某个固定的流程封装到一个final函数中,而且让子类能够定制这个流程的某些或所有步骤(父类抽取的公用代码),这样可以提升代码的复用率,同时也带来了更好的可扩展性。
- 优点:封装不变部分,扩展可变部分;提取公共部分代码,便于维护。
- 缺点:模板方法会带来代码阅读的难度,让用户觉得难以理解。
下面就以现实生活中的计算机开机过程举例,详见代码:
public static abstract class Computer {
protected void powerOn() {
System.out.println("开启电源");
}
protected void checkHardware() {
System.out.println("检查硬件");
}
protected void loadOS() {
System.out.println("载入操作系统");
}
protected void login() {
System.out.println("用户登录,进入系统操作界面");
}
/*计算机启动方法,用final修饰,防止算法框架被重写*/
public final void startUp() {
powerOn();
checkHardware();
loadOS();
login();
}
}
上面定义了一般计算机的启动过程,分别为:开启电源、检查硬件、载入操作系统、用户登录。
接着具体的实现类,普通计算机与注重安全的计算机:
public static class NormalComputer extends Computer {
@Override
protected void login() {
System.out.println("一般用户计算机未设置登录密码,直接进入操作系统");
}
}
public static class SecurityComputer extends Computer {
@Override
protected void checkHardware() {
super.checkHardware();
System.out.println("检查硬件防火墙");
}
@Override
protected void login() {
System.out.println("注重安全的计算机,需指纹识别方可进入操作系统");
}
}
测试代码:
public static void main(String[] args) {
Computer normal = new NormalComputer();
normal.startUp();
System.out.println("===========================");
Computer security = new SecurityComputer();
security.startUp();
/**
开启电源
检查硬件
载入操作系统
一般用户计算机未设置登录密码,直接进入操作系统
===========================
开启电源
检查硬件
检查硬件防火墙
载入操作系统
注重安全的计算机,需指纹识别方可进入操作系统
*/
}