目录
一、定义
模板模式又叫模板方法模式,是指定义一个算法的骨架,也就是执行的步骤模板,然后由子类去实现其中一个或几个步骤。属于行为型设计模式。
二、场景
完成一件事情,需要若干步骤,这些步骤基本相同,可能存在某几个步骤的实现有些许不同的情况。
比如:
业务场景
买杯奶茶:选餐---下单---支付---制作---出餐---评价
入职流程:填写入职登记表---打印简历---复印身份证、学位证书等---签合同---建立花名册---办理工牌---分配工位
上网课:老师发布预习资料---制作课件---直播上课---上传课堂笔记---布置作业---检查作业
Java源码中的应用
AbstractList中的get方法
BaseExecutor的doUpdate、doQuery等
HttpServlet中的service方法
三、例子
下面以上网课为例。
java
public abstract class Course {
protected final void createCourse() {
//1.发布预习资料
uploadPreview();
//2.制作课件
makePPT();
//3.直播或录播上课
attendClass();
//4.上传课堂笔记
uploadNote();
//5.布置作业
if(needHomework()) {
//6.检查作业
checkHomework();
}
}
final void uploadPreview() {
System.out.println("上传预习资料");
}
final void makePPT() {
System.out.println("制作课件");
}
abstract void attendClass();
final void uploadNote() {
System.out.println("上传课堂笔记");
}
abstract boolean needHomework();
abstract void checkHomework();
}
java
public class JavaCourse extends Course {
private boolean needHomework = false;
public JavaCourse(boolean needHomework) {
this.needHomework = needHomework;
}
@Override
void attendClass() {
System.out.println("Java直播上课");
}
@Override
boolean needHomework() {
return needHomework;
}
@Override
void checkHomework() {
System.out.println("检查Java作业");
}
}
java
public class PythonCourse extends Course {
private boolean needHomework = false;
public PythonCourse(boolean needHomework) {
this.needHomework = needHomework;
}
@Override
void attendClass() {
System.out.println("Python录播上课");
}
@Override
boolean needHomework() {
return false;
}
@Override
void checkHomework() {
System.out.println("检查Python作业");
}
}
java
public class Test {
public static void main(String[] args) {
System.out.println("----- Java课程 -----");
Course java = new JavaCourse(true);
java.createCourse();
System.out.println("----- Python课程 -----");
Course python = new PythonCourse(false);
python.createCourse();
}
}
java
----- Java课程 -----
上传预习资料
制作课件
Java直播上课
上传课堂笔记
检查Java作业
----- Python课程 -----
上传预习资料
制作课件
Python录播上课
上传课堂笔记
四、优缺点
优点
1.提高代码复用性,将重复的代码放在抽象类中,由子类去个性化实现不同功能。
2.提高代码扩展性,只需要增加一个子类来实现一个不同功能。
3.符合开闭原则
缺点
1.类的数目增加,间接增加系统复杂度。
2.如果父类增加新的抽象方法,那么所有子类都要改。