Android设计模式-14-模板方法模式
2018-06-12 本文已影响44人
今阳说
1. 定义
- 定义一个模板结构(框架,关键步骤,固定流程),将具体内容延迟到子类去实现
- 基于“继承”
2. 应用场景
- 有多个子类共有的方法,且逻辑相同
- 重要的、复杂的方法,可以考虑作为模板方法
3. 优缺点
- 优点:
- 提高代码复用性
将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中 - 实现了反向控制
通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”(1.封装不变部分,扩展可变部分;2. 行为由父类控制,子类实现)
- 缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
4. Andorid源码中的使用
- AsyncTask:doInBackground方法是必须要重写的,其他的方法如果需要也可以重写,但是若不重写也可以
- Activity的生命周期函数
5. 实例演示
以电脑开机过程为例
- 首先创建一个电脑的抽象类, 其中包含了开机方法startUp以及几个相关的子步骤方法
abstract class Computer {
//1.开机
void powerOn() {
LjyLogUtil.i("1.接入30v电源");
}
//2.硬件检查
void checkHardware() {
LjyLogUtil.i("2 检查硬件");
}
//3.载入操作系统
abstract void loadOS();
//4.登录
void login() {
LjyLogUtil.i("4.输入用户名密码登录");
}
//开机,固定步骤1,2,3,4;设为final防止被复写篡改
public final void startUp() {
LjyLogUtil.i(String.format("%s:-------开机start------", this.getClass().getSimpleName()));
powerOn();
checkHardware();
loadOS();
login();
LjyLogUtil.i(String.format("%s:-------开机end------", this.getClass().getSimpleName()));
}
}
- 创建两个实现类,这里分别以苹果的MAC和戴尔的Dell为例
//苹果的MAC
class MacComputer extends Computer {
@Override
void powerOn() {
// super.powerOn();
LjyLogUtil.i("1.接入20.2v电源");
}
@Override
void checkHardware() {
super.checkHardware();
LjyLogUtil.i("---> 2.2 检查硬件防火墙");
}
@Override
void loadOS() {
LjyLogUtil.i("3.载入mac系统");
}
@Override
void login() {
// super.login();
LjyLogUtil.i("4.输入指纹登录");
}
}
//戴尔的Dell
class DellComputer extends Computer {
@Override
void loadOS() {
LjyLogUtil.i("3.载入windows系统");
}
}
- 分别创建两个电脑实例,调用开机方法
private void methodTemplateMethodPattern() {
MacComputer macComputer = new MacComputer();
macComputer.startUp();
LjyLogUtil.i("\n");
DellComputer dellComputer = new DellComputer();
dellComputer.startUp();
}
上面的代码是非常简单的,主要是理解模版方法模式的思想,以及平时的使用场景