定义:在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。属于行为设计
先来个类图:
看一个具体的例子
package com.study.template;
//使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为性设计模式
public abstract class NetworkCourse {
//一次性实现一个算法的不变的部分
protected final void createCourse(){
//1、发布预习资料
this.postPreResource();
//2、制作 PPT 课件
this.createPPT();
//3、在线直播
this.liveVideo();
//4、提交课件、课堂笔记
this.postNote();
//5、提交源码
this.postSource();
//6、布置作业,有些课是没有作业,有些课是有作业的
//如果有作业的话,检查作业,如果没作业,完成了
if(needHomework()){
checkHomework();
}
}
// 并将可变的行为留给子类来实现。
abstract void checkHomework();
//钩子方法:实现流程的微调
protected boolean needHomework(){return false;}
final void postSource(){
System.out.println("提交源代码");
}
final void postNote(){
System.out.println("提交课件和笔记");
}
final void liveVideo(){
System.out.println("直播授课");
}
final void createPPT(){
System.out.println("创建备课 PPT");
}
final void postPreResource(){
System.out.println("分发预习资料");
}
}
public class BigDataCourse extends NetworkCourse {
private boolean needHomeworkFlag = false;
public BigDataCourse(boolean needHomeworkFlag) {
this.needHomeworkFlag = needHomeworkFlag;
}
void checkHomework() {
System.out.println("检查大数据的课后作业");
}
@Override
protected boolean needHomework() {
return this.needHomeworkFlag;
}
}
总结一把:模板方法模式为我们提供了一种代码复用的重要技巧。抽象类可以定义具体的方法,抽象方法和钩子。钩子方法的目的主要是干预执行流程。钩子方法的返回值一般是boolean.策略模式则封装算法。一个用组合一个用继承。