模板模式
首先来看一下模板模式的简介:模板模式(Template Pattern),一是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为性设计模式。模板方法适用于以下应用场景:
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
生活中的很多小事都是模板模式的体现,比如我们去医院看病的流程:1.挂号 2.看病
3.做检查 4.拿药,下面我们通过代码来体会一下。
首先写一个看病的抽象类SeeDoctor,特别提一下,在这个类中有一个钩子方法needChecked,关于钩子方法的定义:通过一个方法来干涉另一个方法的行为,就是一个方法的返回结果或修改的变量是另一个方法执行时的if判断条件或for/while循环调用条件的。在模板模式中,钩子方法和模板模式没有必然的关系,也就是说模板模式中可以有钩子方法也可以没有钩子方法,具体是否使用钩子方法根据业务判断。
/**
* @author: Winston
* @createTime: 2021/6/28
* <p>
* 模板会有一个或者多个未实现的方法
* 而且这些未实现的方法有固定的执行顺序
* 看病流程
*/
public abstract class SeeDoctor {
/**
* 去医院看病的流程
*/
protected void goToHospital() {
// 1.挂号
this.register();
// 2.找医生看病
this.lookingForDoctor();
// 3.做检查,有些病人是需要做检查的,而有些病人是不需要做检查的
// 这里的needChecked()方法就是钩子方法
if (needChecked()) {
// 检查方法,病人做检查的项目不一样
this.checked();
}
// 4.拿药
this.takeMedicine();
}
public final void takeMedicine() {
System.out.println("根据药方拿药");
}
protected abstract void checked();
// 钩子方法,钩子方法的定义:通过一个方法来干涉另一个方法的行为,就是一个方法的返回结果或修改的变量是另一个方法执行时的if判断条件或for/while循环调用条件的
protected boolean needChecked(){
return false;
}
public final void lookingForDoctor() {
System.out.println("找医生诊断");
}
public final void register() {
System.out.println("挂号");
}
}
编写张三看病类ZhangSanSeeDoctor
public class ZhangSanSeeDoctor extends SeeDoctor {
@Override
protected void checked() {
System.out.println("张三做的检查项目:");
}
}
编写李四看病类LiSiSeeDoctor
public class LiSiSeeDoctor extends SeeDoctor {
/**
* 是否需要检查
*/
private boolean needChecked = false;
/**
* 通过构造方法将needChecked的值改变
* @param needChecked
*/
public LiSiSeeDoctor(boolean needChecked) {
this.needChecked = needChecked;
}
@Override
protected boolean needChecked() {
return this.needChecked;
}
@Override
protected void checked