给定一个指定的流程(即模板),在这个指定流程下,又流出一定的可由用户选择的分支(即钩子)。用户在大体的流程上都必须按照模板进行,但在某个分支小点可以有自己选择的权利。
示例
准备一个规范的流程:一个抽象类
public abstract class NetWorkCourse {
//创建一个课程的规范化流程模板
protected final void creatCrouse(){
//1.发布预习资料
this.postPreResource();
//2.制作PPT
this.creatPpt();
//3.授课
this.liveVideo();
//4.上传笔记
this.postNote();
//5.提交源码
this.postCode();
//6.布置作业-有的课程有,有的课程没有(用户选择)
if(hasHomeWork()){
//有作业就检查作业
checkHomeWork();
}
}
/**
* 检查的方法不一样,故先抽象
*/
abstract void checkHomeWork();
/**
* 是否有作业
* 可被重写
* 钩子方法:用户通过此方法可以来微调这个流程
* @return boolean
*/
protected boolean hasHomeWork() {
return false;
}
/**
* 不可重写的方法
* 提交源码
*/
final void postCode() {
System.out.println("提交源码");
}
/**
* 不可重写的方法
* 上传笔记
*/
final void postNote() {
System.out.println("上传笔记");
}
/**
* 不可重写的方法
* 授课
*/
final void liveVideo() {
System.out.println("正式上课");
}
/**
* 不可重写的方法
* 制作PPT
*/
final void creatPpt() {
System.out.println("创建ppt");
}
/**
* 不可重写的方法
* 发放预习资料
*/
final void postPreResource() {
System.out.println("分发预习资料");
}
}
创建参照这个流程而执行的不同的实例
Java课程默认没有作业
public class JavaCourse extends NetWorkCourse {
@Override
void checkHomeWork() {
System.out.println("检查Java设计模式的作业");
}
}
大数据课程默认有作业
public class BigDataCourse extends NetWorkCourse {
/**
* 是否需要课后作业的标记
*/
private boolean hasHomeWorkFlag = false;
/**
* 有参构造
* @param hasHomeWorkFlag
*/
public BigDataCourse(boolean hasHomeWorkFlag) {
this.hasHomeWorkFlag = hasHomeWorkFlag;
}
/**
* 重写钩子方法
* @return
*/
@Override
protected boolean hasHomeWork() {
return this.hasHomeWorkFlag;
}
/**
* 检查作业
*/
@Override
void checkHomeWork() {
System.out.println("检查大数据的课后作业");
}
}
测试类:
public static void main(String[] args) {
System.out.println("----Java设计模式课程----");
JavaCourse javaCourse = new JavaCourse();
javaCourse.creatCrouse();
System.out.println("----大数据课程----");
BigDataCourse bigDataCourse = new BigDataCourse(true);
bigDataCourse.creatCrouse();
}
结果:
留出钩子方法的目的就是为了实现流程的微调,有的课程有作业,有的课程没有作业,只有有作业的课程才需要检查作业。而流程的其他步骤对应的方法都是一样的,所以均定义为final
类之间的关系