模板模式的应用场景
模板模式又叫模板方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板模式适用于以下场景:
- 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
 - 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
 
以咕泡学院的课程创建流程为例:发布预习资料->制作课件 PPT->在线直播->提交课堂笔记->提交源码->布置作业->检查作业。首先创建 NetworkCourse 抽象类:
package com.yjw.demo.pattern.template2;public abstract class NetworkCourse {protected final void createCourse() {// 发布预习资料this.postPreResource();// 制作课件PPTthis.createPPT();// 在线直播this.liveVideo();// 提交课堂笔记this.postNote();// 提交源码this.postSource();// 布置作业,有些课程是没有作业的,有些课程是有作业的// 如果有作业,检查作业,如果没有作业,流程结束if (needHomework()) {checkHomework();}}private void postPreResource() {System.out.println("发布预习资料");}private void createPPT() {System.out.println("制作课件PPT");}private void liveVideo() {System.out.println("在线直播");}private void postNote() {System.out.println("提交源代码");}private void postSource() {System.out.println("提交课件和笔记");}/*** 钩子方法:实现流程的微调** @return*/protected boolean needHomework() {return false;}protected abstract void checkHomework();}
在上面的代码中有个钩子方法,可能有些“小伙伴”还不太理解,在此稍作解释。设计钩子方法的主要目的是干预执行流程,使得控制行为更加灵活,更符合实际业务的需求。钩子方法的返回值一般为适合条件分支语句的返回值。
“小伙伴们”可以根据自己的业务场景来决定是否使用钩子方法。接下来创建 JavaCourse 类:
public class JavaCourse extends NetworkCourse {@Overrideprotected void checkHomework() {System.out.println("检查Java的课堂作业");}}
创建 BigDataCourse 类:
package com.yjw.demo.pattern.template2;public class BigDataCourse extends NetworkCourse {private boolean needHomeworkFlag = false;public BigDataCourse(boolean needHomeworkFlag) {this.needHomeworkFlag = needHomeworkFlag;}@Overrideprotected boolean needHomework() {return this.needHomeworkFlag;}@Overrideprotected void checkHomework() {System.out.println("检查大数据的课堂作业");}}
客户端测试代码如下:
package com.yjw.demo.pattern.template2;public class NetworkCourseTest {public static void main(String[] args) {System.out.println("---Java 架构师课程---");NetworkCourse javaCourse = new JavaCourse();javaCourse.createCourse();System.out.println("---大数据课程---");NetworkCourse bigDataCourse = new BigDataCourse(true);bigDataCourse.createCourse();}}
模板模式的优缺点
模板模式的优点如下:
- 利用模板模式将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
 - 将不同的代码放到不同的子类中,通过对子类的扩展增加新的行为,可以提高代码的扩展性。
 - 把不变的行为写在父类中,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。
 
模板模式的缺点如下:
- 每个抽象类都需要一个子类来实现,导致了类的数量增加。
 - 类数量的增加间接地增加了系统的复杂性。
 - 因为继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
 
摘录:《Spring 5 核心原理与30个类手写实战》来自文艺界的Tom老师的书籍。
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/ghgf2d 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
