抓住问题核心——模板方法模式
2019-03-15 本文已影响14人
程序员丶星霖
《Android源码设计模式解析与实战》读书笔记(十五)
《Android源码设计模式解析与实战》PDF资料下载
一、模板方法简介
在面向对象开发过程中,通常会遇到一个问题,我们知道一个算法所需的关键步骤,并确定了步骤的执行顺序,但是某些步骤的具体实现是未知的。
1.1、定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
1.2、使用场景
- 多个子类有公有的方法,并且逻辑基本相同时。
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
二、简单示例
//抽象的Computer
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("小白的计算机无验证,直接进入系统");
}
/**
* 启动计算机方法,步骤固定为开启电源、系统检查、加载操作系统、用户登录。
* 该方法为final,防止算法框架被覆写。
*/
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 checkHardware() {
super.checkHardware();
System.out.println("检查硬件防火墙");
}
protected void login() {
System.out.println("进行指纹识别等复杂的用户验证");
}
}
public class Test {
public static void main(String[] args) {
AbstractComputer comp = new CoderComputer();
comp.startUp();
comp = new MilitaryComputer();
comp.startUp();
}
}
输出结果:
模板方法模式.png三、总结
模板方法模式可以概括为:流程封装。就是把某个固定的流程封装到一个final函数中,并且让子类能够定制这个流程中的某些或者所有步骤,这就要求父类提取共用的代码,提升代码的复用率,同时也带来了更好的可扩展性。
3.1、优点
- 封装不变部分,扩展可变部分;
- 提取公共部分代码,便于维护。
3.2、缺点
- 模板方法会带来代码阅读的难度,会让用户觉得难以理解。