模板模式通常又叫模板方法模式(Template Method Pattern)是指定义一个算法骨架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板方法适用于一下应用场景:
-
一次性实现一个算法不变的部分,并将可变的行为留给子类来实现。
-
各子类中公共的行为被提取出来 并集中到一个公共的父类中,从而避免代码重复。
还是以课程为例:发布预习资料-->制作课件PPT-->在线直播-->提交笔记-->提交源码-->布置作业-->检查作业
创建NetworkCourse抽象类:
package com.wenbin.design.pattern.template.course;
/**
* 模板会有一个或者多个未现实方法,
* 而且这几个未实现方法有固定的执行循序
*/
public abstract class NetworkCourse {
protected final void createCourse() {
// 1,发布预习资料
this.postPreResource();
// 2,制作PPT课件
this.createPPT();
// 3,在线直播
this.liveVideo();
// 4,提交课件
this.postNote();
// 5,提交源码
this.postSource();
// 6,布置作业,有些课没有作业,有些是有作业
if (needHomework()) {
checkHomework();
}
}
abstract void checkHomework();
// 钩子方法:实现流程的微调
protected boolean needHomework() {
return false;
}
final void postSource() {
System.out.println("提交源码");
}
final void postNote() {
System.out.println("提交课件和笔记");
}
final void liveVideo() {
System.out.println("直播授课");
}
final void createPPT() {
System.out.println("创建备课PPT");
}
final void postPreResource() {
System.out.println("发布预习资料");
}
}
上面代码中的钩子方法主要目的是用来干预执行流程,使得我们控制行为流程更加灵活,更能贴合实际业务需求。钩子方法的返回值一般为适合条件分支语句的返回值(如boolean、int)等。可以根据业务场景决定是否使用钩子方法。
创建JavaCourse类:
package com.wenbin.design.pattern.template.course;
public class JavaCourse extends NetworkCourse {
void checkHomework() {
System.out.println("检查Java作业");
}
}
创建BigDataCourse类:
package com.wenbin.design.pattern.template.course;
public class BigDataCourse extends NetworkCourse {
private boolean needHomeworkFlag = false;
public BigDataCourse(boolean needHomeworkFlag) {
this.needHomeworkFlag = needHomeworkFlag;
}
@Override
void checkHomework() {
System.out.println("检查大数据的作业");
}
@Override
protected boolean needHomework() {
return this.needHomeworkFlag;
}
}
测试代码:
package com.wenbin.design.pattern.template.course;
public class NetwokrCourseTest {
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();
}
}
通过这个案例对模板模式有一个了解。
优点:
- 利用模板方法将相同的处理逻辑的代码放到抽象父类中,可以提高代码复用性。
- 将不同的代码在不同子类实现,通过对子类对父类的扩展增加新的行为,提高代码的扩展性。
- 把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。
缺点:
- 类数目增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加。
- 类熟练的增加,简介的增加了系统实现的复杂度。
- 继承关系自身确定,如果父类添加新的抽象方法,所有子类都要改一遍。
模板方法模式比较简单,多结合业务场景思考问题,就能把模板方法模式运用好。