作用
定义算法的骨架
比如有很多代码有很多相似的内容,只有少部分细节不一样,这时候就可以用到模板方法模式
此次demo实现的逻辑为:
上课有很多步骤是相似,比如制作ppt,录制视频,写手记(非必要),发布课程
有些不需要变动的方法可以用final修饰
非必要的方法可以使用一个钩子方法来进行判断是否要执行该方法,让模板方法更灵活
模板方法类
定义一个抽象的类,写好大部分方法,剩下少部分业务逻辑就留抽象方法供子类实现即可
java8开始接口也可以写默认方法了,用接口来作为模板方法供子类实现的方式也很不错?
public abstract class BaseCourse {
/**
* 制作课程 制作ppt、录制视频、写手记(非必要)、发布课程
*
* @author YangYudi
* @date 2020/12/4 13:32
*/
protected final void makeCourse() {
makePpt();
makeVideo();
//是否需要编写手记 默认为false
if (needWriteArticle()) {
writeArticle();
}
packageCourse();
}
protected final void makePpt() {
System.out.println("制作ppt");
}
protected final void makeVideo() {
System.out.println("制作视频");
}
protected final void writeArticle() {
System.out.println("编写手记");
}
/**
* 钩子方法 用来判断是否要编写手记
* 有些方法非必要 是否需要使用就交由调用者来决定
*
* @return boolean
* @author YangYudi
* @date 2020/12/4 13:11
*/
protected boolean needWriteArticle() {
return false;
}
/**
* 发布课程 由子类实现
*
* @author YangYudi
* @date 2020/12/4 14:03
*/
protected abstract void packageCourse();
}
模板方法实现类
大部分方法由父类实现好了,子类只需要实现一些细节就行了
写死,所以手记方法必执行
public class DesignPatternCourse extends BaseCourse {
@Override
public void packageCourse() {
System.out.println("提供设计模式课程代码");
}
/**
* 需要手记(写死)
*
* @return boolean
* @author YangYudi
* @date 2020/12/4 17:13
*/
@Override
public boolean needWriteArticle() {
return true;
}
}
手记方法是否执行交给应用层决定
public class FrontCourse extends BaseCourse {
/**
* 将钩子 开放给调用者 可以选择使用构造方法或set方法
*/
private boolean needWriteArticle = false;
public FrontCourse(boolean needWriteArticle) {
this.needWriteArticle = needWriteArticle;
}
@Override
public void packageCourse() {
System.out.println("提供前端课程代码");
System.out.println("提供课程视频");
}
@Override
public boolean needWriteArticle() {
return this.needWriteArticle;
}
}
应用层使用
public static void main(String[] args) {
DesignPatternCourse designPatternCourse = new DesignPatternCourse();
designPatternCourse.makeCourse();
System.out.println("===================");
//手动决定是否使用手记方法
FrontCourse frontCourse = new FrontCourse(true);
frontCourse.makeCourse();
}