前言
此笔记摘抄于《Android源码设计模式解析与实战》一书
模板方法模式的定义
定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式的使用场景
- 多个子类有公共的方法,并且逻辑基本相同。
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
模板方法模式的简单实例
模板方法实际上是封装一个固定流程,就像是一套执行模板一样,第一步该做什么,第二步都已经在抽象类中定义好了。
//抽象的父类,定制好模板
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("-----开机-----");
powerOn();
checkHardware();
loadOS();
login();
System.out.println("-----关机-----");
}
}
//具体的子类A
public class CoderComputer extends AbstractComputer{
@override
protected void login(){
System.out.println("程序员需要进行用户和密码验证登录进入系统");
}
}
//具体的子类B
public class MilitaryComputer extends AbstractComputer{
@override
protected void checkHardware(){
System.out.println("硬件检查防火墙");
}
@override
protected void login(){
System.out.println("进行指纹识别等复杂的用户操作才能登录进入系统");
}
}
//测试代码
public class Test{
public static void main(String[] args){
AbstractComputer comp = new CoderComputer();
comp.startUp();
comp = new MilitrayComputer();
comp.startUp();
}
}
Android源码中的模板方法以及涉及到的重要概念
- AsyncTask(使用到了模板方法模式)
- zygote进程
- SystemServer
- ActivityManagerService、WindowManagerService等系统核心服务
- ActivityThread
总结
在开发Android应用时,在BaseActivity、BaseFragment等类中就是使用了模板方法模式。
- 优点
- 封装不变部分,拓展可变部分。
- 提取公共部分代码,便于维护。
- 缺点
模板方法模式会带来代码阅读的难度,会让用户觉得难以理解。