1. 模板模式介绍
1、模板模式即模板方法模式自定义了一个操作中的算法骨架,而将步骤延迟到子类中,使得子类可以不改变一个算法的结构,可以自定义该算法的某些特定步骤;
2、父类中提取了公共的部分代码,便于代码复用;
3、部分抽象方法是由子类实现的,子类可以通过方法实现增加相应的功能;
4、为了防止公共骨架方法重写操作,一般公共流程方法上都加有 final 关键字;
5、自定义钩子方法控制公共流程方法某些步骤是否需要执行。
2.模板模式结构类
① 抽象方法:模板抽象类中自定义,由实现类具体实现。
② 具体方法:模板抽象类中非抽象方法(公共流程方法),实现类中可以继承或重写它。
③ 钩子方法:模板抽象类已经实现,用于判断的逻辑方法。实现类决定是否重写此方法,该方法为钩子方法
3.模板模式代码案例
一、模板抽象类
public abstract class IRobotTemplate<T> {
// 骨架算法(流程)
public final void processExecute(T param) {
this.executeGo(param);
// 钩子方法决定是否执行(默认不执行)
if (this.isOpen()) {
this.executeRun(param);
}
}
// 步骤1-待实现
public abstract void executeRun(T param);
// 步骤2-待实现
public abstract void executeGo(T param);
// 钩子方法
public boolean isOpen() {
return false;
}
}
二、模板实现类
@Component
public class RobotTemplate extends IRobotTemplate<UserInfo> {
@Override
public void executeRun(UserInfo userInfo) {
System.out.println(userInfo.getUsername() + "会跑步");
}
@Override
public void executeGo(UserInfo userInfo) {
System.out.println(userInfo.getUsername() + "会走路");
}
@Override
public boolean isOpen() {
return true; // 重写钩子方法;使执行executeRun方法
}
}
三、运行模板模式
@Resource
private IRobotTemplate robotTemplate;
@Override
public void process(UserInfo userInfo) {
userInfo = new UserInfo();
userInfo.setUsername("机器人小智");
// 执行模板抽象类中的公共流程方法
robotTemplate.processExecute(userInfo);
}
四、执行结果