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