模板模式的应用场景
模板模式又叫模板方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板模式适用于以下场景:
- 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
以咕泡学院的课程创建流程为例:发布预习资料->制作课件 PPT->在线直播->提交课堂笔记->提交源码->布置作业->检查作业。首先创建 NetworkCourse 抽象类:
package com.yjw.demo.pattern.template2;
public abstract class NetworkCourse {
protected final void createCourse() {
// 发布预习资料
this.postPreResource();
// 制作课件PPT
this.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 {
@Override
protected 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;
}
@Override
protected boolean needHomework() {
return this.needHomeworkFlag;
}
@Override
protected 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 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。