1.定义
- 定义一个抽象算法流程,将具体实现延迟到子类
- 应该很广泛,比如生命周期方法、Android中异步任务AsyncTask等
2.UML类图
- 角色介绍
AbstrateTemplate : 模板抽象类,定义一套流程
ConcreteA : 具体实现类
ConcreteB : 具体实现类 - 要点
流程方法execute()通常用final关键字修饰,表示不可重新定义
3.UML示例代码
/**
* Copyright (C), 2016-2020
* FileName: AbstractTemplate
* Author: wei.zheng
* Date: 2019/12/18 9:48
* Description: 模板抽象类
*/
public abstract class AbstractTemplate {
public final void execute() {
stepOne();
stepTwo();
stepThree();
}
protected void stepOne() {
System.out.println("stepOne");
}
protected void stepTwo() {
System.out.println("stepTwo");
}
protected void stepThree() {
System.out.println("stepThree");
}
}
/**
* Copyright (C), 2016-2020
* FileName: ConcreteA
* Author: wei.zheng
* Date: 2019/12/18 21:14
* Description: ConcreteA 具体实现A, 可以覆盖各个流程方法
*/
public class ConcreteA extends AbstractTemplate {
@Override
protected void stepOne() {
System.out.println("ConcreteA stepOne");
}
@Override
protected void stepTwo() {
System.out.println("ConcreteA stepTwo");
}
@Override
protected void stepThree() {
System.out.println("ConcreteA stepThree");
}
}
/**
* Copyright (C), 2016-2020
* FileName: ConcreteB
* Author: wei.zheng
* Date: 2019/12/18 21:15
* Description: ConcreteB 具体实现B
*/
public class ConcreteB extends AbstractTemplate {
@Override
protected void stepOne() {
System.out.println("ConcreteB stepOne");
}
@Override
protected void stepTwo() {
System.out.println("ConcreteB stepTwo");
}
@Override
protected void stepThree() {
System.out.println("ConcreteB stepThree");
}
}
/**
* Copyright (C), 2016-2020
* FileName: Client
* Author: wei.zheng
* Date: 2019/12/18 21:19
* Description: 模板方法模式用户类
*/
public class Client {
public static void main(String[] args) {
ConcreteA concreteA = new ConcreteA();
ConcreteB concreteB = new ConcreteB();
// 流程一样,但是两个类具体实现不同
concreteA.execute();
concreteB.execute();
}
}
// 运行结果
2019-12-18 21:22:25.917 4811-4811/? I/System.out: ConcreteA stepOne
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteA stepTwo
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteA stepThree
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteB stepOne
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteB stepTwo
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteB stepThree
4.总结
模板方法的核心是封装流程,并将具体实现延迟到子类实现。
- 优缺点
优点:抽象公共代码,封装流程(不变),扩展实现(可变)
缺点:具体实现类是继承关系,影响阅读难度(习惯就好)