模板模式的应用场景

模板模式又叫模板方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板模式适用于以下场景:

  1. 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
  2. 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。

以咕泡学院的课程创建流程为例:发布预习资料->制作课件 PPT->在线直播->提交课堂笔记->提交源码->布置作业->检查作业。首先创建 NetworkCourse 抽象类:

  1. package com.yjw.demo.pattern.template2;
  2. public abstract class NetworkCourse {
  3. protected final void createCourse() {
  4. // 发布预习资料
  5. this.postPreResource();
  6. // 制作课件PPT
  7. this.createPPT();
  8. // 在线直播
  9. this.liveVideo();
  10. // 提交课堂笔记
  11. this.postNote();
  12. // 提交源码
  13. this.postSource();
  14. // 布置作业,有些课程是没有作业的,有些课程是有作业的
  15. // 如果有作业,检查作业,如果没有作业,流程结束
  16. if (needHomework()) {
  17. checkHomework();
  18. }
  19. }
  20. private void postPreResource() {
  21. System.out.println("发布预习资料");
  22. }
  23. private void createPPT() {
  24. System.out.println("制作课件PPT");
  25. }
  26. private void liveVideo() {
  27. System.out.println("在线直播");
  28. }
  29. private void postNote() {
  30. System.out.println("提交源代码");
  31. }
  32. private void postSource() {
  33. System.out.println("提交课件和笔记");
  34. }
  35. /**
  36. * 钩子方法:实现流程的微调
  37. *
  38. * @return
  39. */
  40. protected boolean needHomework() {
  41. return false;
  42. }
  43. protected abstract void checkHomework();
  44. }

在上面的代码中有个钩子方法,可能有些“小伙伴”还不太理解,在此稍作解释。设计钩子方法的主要目的是干预执行流程,使得控制行为更加灵活,更符合实际业务的需求。钩子方法的返回值一般为适合条件分支语句的返回值。

“小伙伴们”可以根据自己的业务场景来决定是否使用钩子方法。接下来创建 JavaCourse 类:

  1. public class JavaCourse extends NetworkCourse {
  2. @Override
  3. protected void checkHomework() {
  4. System.out.println("检查Java的课堂作业");
  5. }
  6. }

创建 BigDataCourse 类:

  1. package com.yjw.demo.pattern.template2;
  2. public class BigDataCourse extends NetworkCourse {
  3. private boolean needHomeworkFlag = false;
  4. public BigDataCourse(boolean needHomeworkFlag) {
  5. this.needHomeworkFlag = needHomeworkFlag;
  6. }
  7. @Override
  8. protected boolean needHomework() {
  9. return this.needHomeworkFlag;
  10. }
  11. @Override
  12. protected void checkHomework() {
  13. System.out.println("检查大数据的课堂作业");
  14. }
  15. }

客户端测试代码如下:

  1. package com.yjw.demo.pattern.template2;
  2. public class NetworkCourseTest {
  3. public static void main(String[] args) {
  4. System.out.println("---Java 架构师课程---");
  5. NetworkCourse javaCourse = new JavaCourse();
  6. javaCourse.createCourse();
  7. System.out.println("---大数据课程---");
  8. NetworkCourse bigDataCourse = new BigDataCourse(true);
  9. bigDataCourse.createCourse();
  10. }
  11. }

模板模式的优缺点

模板模式的优点如下:

  1. 利用模板模式将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
  2. 将不同的代码放到不同的子类中,通过对子类的扩展增加新的行为,可以提高代码的扩展性。
  3. 把不变的行为写在父类中,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。

模板模式的缺点如下:

  1. 每个抽象类都需要一个子类来实现,导致了类的数量增加。
  2. 类数量的增加间接地增加了系统的复杂性。
  3. 因为继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。

摘录:《Spring 5 核心原理与30个类手写实战》来自文艺界的Tom老师的书籍。

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/ghgf2d 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。