作用

定义算法的骨架

比如有很多代码有很多相似的内容,只有少部分细节不一样,这时候就可以用到模板方法模式

此次demo实现的逻辑为:

上课有很多步骤是相似,比如制作ppt,录制视频,写手记(非必要),发布课程

有些不需要变动的方法可以用final修饰

非必要的方法可以使用一个钩子方法来进行判断是否要执行该方法,让模板方法更灵活

模板方法类

定义一个抽象的类,写好大部分方法,剩下少部分业务逻辑就留抽象方法供子类实现即可

java8开始接口也可以写默认方法了,用接口来作为模板方法供子类实现的方式也很不错?

  1. public abstract class BaseCourse {
  2. /**
  3. * 制作课程 制作ppt、录制视频、写手记(非必要)、发布课程
  4. *
  5. * @author YangYudi
  6. * @date 2020/12/4 13:32
  7. */
  8. protected final void makeCourse() {
  9. makePpt();
  10. makeVideo();
  11. //是否需要编写手记 默认为false
  12. if (needWriteArticle()) {
  13. writeArticle();
  14. }
  15. packageCourse();
  16. }
  17. protected final void makePpt() {
  18. System.out.println("制作ppt");
  19. }
  20. protected final void makeVideo() {
  21. System.out.println("制作视频");
  22. }
  23. protected final void writeArticle() {
  24. System.out.println("编写手记");
  25. }
  26. /**
  27. * 钩子方法 用来判断是否要编写手记
  28. * 有些方法非必要 是否需要使用就交由调用者来决定
  29. *
  30. * @return boolean
  31. * @author YangYudi
  32. * @date 2020/12/4 13:11
  33. */
  34. protected boolean needWriteArticle() {
  35. return false;
  36. }
  37. /**
  38. * 发布课程 由子类实现
  39. *
  40. * @author YangYudi
  41. * @date 2020/12/4 14:03
  42. */
  43. protected abstract void packageCourse();
  44. }

模板方法实现类

大部分方法由父类实现好了,子类只需要实现一些细节就行了

写死,所以手记方法必执行

  1. public class DesignPatternCourse extends BaseCourse {
  2. @Override
  3. public void packageCourse() {
  4. System.out.println("提供设计模式课程代码");
  5. }
  6. /**
  7. * 需要手记(写死)
  8. *
  9. * @return boolean
  10. * @author YangYudi
  11. * @date 2020/12/4 17:13
  12. */
  13. @Override
  14. public boolean needWriteArticle() {
  15. return true;
  16. }
  17. }

手记方法是否执行交给应用层决定

  1. public class FrontCourse extends BaseCourse {
  2. /**
  3. * 将钩子 开放给调用者 可以选择使用构造方法或set方法
  4. */
  5. private boolean needWriteArticle = false;
  6. public FrontCourse(boolean needWriteArticle) {
  7. this.needWriteArticle = needWriteArticle;
  8. }
  9. @Override
  10. public void packageCourse() {
  11. System.out.println("提供前端课程代码");
  12. System.out.println("提供课程视频");
  13. }
  14. @Override
  15. public boolean needWriteArticle() {
  16. return this.needWriteArticle;
  17. }
  18. }

应用层使用

  1. public static void main(String[] args) {
  2. DesignPatternCourse designPatternCourse = new DesignPatternCourse();
  3. designPatternCourse.makeCourse();
  4. System.out.println("===================");
  5. //手动决定是否使用手记方法
  6. FrontCourse frontCourse = new FrontCourse(true);
  7. frontCourse.makeCourse();
  8. }