学习设计模式不光要学习设计模式的思想,还要去深入理解,为什么要用这个设计模式。
如何深入理解?读优秀的框架代码,看别人代码,了解它们的使用场景。 - - - 博主老师(感谢他)
本文先介绍了模板方法模式的概念及简单实现。
1、概念
定义:定义一个操作中的算法的框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2、实现
考虑这么个例子:
电脑开机这个动作:需要执行以下步骤:硬件检查、载入操作系统、登录。
博主的电脑开机:在登录步骤是用密码登录。
博主老师的电脑开机:在硬件检查步骤 需要额外检查硬件防火墙;在登录步骤 需要用指纹认证。
public abstract class AbstractComputer {
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");
checkHardware();
loadOS();
login();
System.out.println("开机结束");
}
}
public class CorderComputer extends AbstractComputer {
@Override
protected void login() {
System.out.println("程序员的计算器需要验证用户名密码");
}
}
public class MasterComputer extends AbstractComputer {
@Override
protected void checkHardware() {
super.checkHardware();
System.out.println("检查硬件防火墙");
}
@Override
protected void login() {
System.out.println("进行指纹识别等复杂的验证");
}
}
测试类
public static void main(String[] args) {
System.out.println("我的电脑执行开机:");
AbstractComputer computer = new CorderComputer();
computer.startUp();
System.out.println();
System.out.println("师傅的电脑执行开机:");
AbstractComputer computer1 = new MasterComputer();
computer1.startUp();
}
输出
我的电脑执行开机:
开机-start
硬件检查
载入操作系统
程序员的计算器需要验证用户名密码
开机结束
师傅的电脑执行开机:
开机-start
硬件检查
检查硬件防火墙
载入操作系统
进行指纹识别等复杂的验证
开机结束
3、思考
模板方法模式在平时工作代码中应该还是用过的,只不过当时不知道这也是个设计模式。
它和策略模式的区别:
一个“策略”是一个 整体的(完整的) 算法,算法是可以被整体替换的。而模板方法只能被替换其中的特定点,算法流程是固定不可变的。
由于这个模式比较简单,也不需要再去找实现了。JDK源码中其实有好多,AbstractList是ArrayList的模板。AbstractMap是HashMap的模板等等。