1. 概述(官方解释)
模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。该模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2. 个人理解
顾名思义,就是做一些任务的通用流程 比如: 自我介绍模板、推荐信模板
准备一个抽象类,用于定义模板(步骤的模板),把部分确定的逻辑定义在某些方法中,用其他抽象方法实现剩余的逻辑。不同子类对这些逻辑有不同的实现。
定义多个抽象操作,定义并实现一个模板方法,将步骤放在这个具体方法里,推迟到子类实现。子类可以改变父类的可变部分,但不能改变模板方法所代表的顶级逻辑
3.模板中的角色
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
4. 应用场景
在某些类的算法中,用了相同的方法,造成代码的重复。
控制子类扩展,子类必须遵守算法规则。
5. 自动化测试中的应用场景
做API自动化测试,场景有运行单个Case,自动化回归,运行被选中的几条Cases,运行流程是一样的,但是具体操作有些不同。
具体流程: 1)准备数据 2)初始化数据 3) 发送请求 4) 获取响应后的断言和处理 5)运行完的处理 。 我们框架中只有3) 4)使用的机制是一样的,在准备数据。。。还有 5)运行完的处理都不一样。这种场景就可以使用模板方式定义
举例
抽象类
public abstract class AbstractTesting {
// 模板
public void test() {
// 测试数据获取
getTestCases();
// 获取测试相关信息
intData();
// 发送请求 获取响应
sendRequest();
// 响应数据校验
assertResponse();
// 后续处理
afterTesting();
}
private void assertResponse() {
System.out.println("断言");
}
private void sendRequest() {
System.out.println("发送请求");
}
public abstract void getTestCases();
public abstract void intData();
public abstract void afterTesting();
}
具体类
public class TimingRunCases extends AbstractTesting {
@Override
public void getTestCases() {
}
@Override
public void intData() {
}
@Override
public void afterTesting() {
}
}
6. 举例
抽象类
public abstract class XiaoPin {
public abstract void jiaoLiu();
public abstract void xuShi();
public abstract void gaoXiao();
public abstract void shanQing();
public final void act() {
jiaoLiu();
xuShi();
gaoXiao();
shanQing();
}
}
具体类
public class DaPuKe extends XiaoPin {
@Override
public void gaoXiao() {
System.out.println("名片当作扑克");
}
@Override
public void jiaoLiu() {
System.out.println("顺口溜");
}
@Override
public void shanQing() {
System.out.println("马家军");
}
@Override
public void xuShi() {
System.out.println("火车除夕,老同学见面");
}
}
场景类
public class TestTemplateMethod {
public static void main(String[] args) {
XiaoPin xp = new DaPuKe();
xp.act();
}
}