模版方法模式

1 概念

1 定义

定义一个算法的骨架,允许子类为一个或者多个步骤提供实现。

使子类在不改变算法结构的情况下,重新定义算法的某些步骤

类型:行为型

2 应用场景

  • 一次性实现一个算法不变的部分,并将可变的行为留给子类实现

  • 将各类中公共的行为抽取出来到一个公共的父类中,避免代码重复

3 优缺点

优点:

  • 提高复用性
  • 提高扩展性
  • 符合开闭原则

缺点:

  • 类数目增加
  • 增加系统复杂度
  • 继承自身缺点,如果父类添加新的抽象方法,所有子类都需要改一遍。

2 代码实现

场景:

准备讲解前端和后端课程流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public abstract class ACourse {

protected final void makeCourse(){
this.makePPT();
this.makeVideo();
if(needWriteArticle()){
this.writeArticle();
}
this.prepareContentMaterial();
}

// 注意这里如果是必须要执行的步骤,必须加final,否则子类可以重写,就打乱了步骤
final void makePPT(){
System.out.println("制作PPT");
}
final void makeVideo(){
System.out.println("制作视频");
}
final void writeArticle(){
System.out.println("编写课堂笔记");
}

//钩子方法,注意这里不是final的子类可以复写它
protected boolean needWriteArticle(){
return false;
}
abstract void prepareContentMaterial();
}

1
2
3
4
5
6
7
8
9
10
11
12
public class BackEndCourse extends ACourse {
@Override
void prepareContentMaterial() {
System.out.println("提供课程Java源代码");
}

@Override
protected boolean needWriteArticle() {
return true;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class FECourse extends ACourse {
private boolean needWriteArticleFlag = false;
@Override
void prepareContentMaterial() {
System.out.println("提供课程的前端代码");
System.out.println("提供课程的图片等多媒体素材");
}

public FECourse(boolean needWriteArticleFlag) {
this.needWriteArticleFlag = needWriteArticleFlag;
}

@Override
protected boolean needWriteArticle() {
return this.needWriteArticleFlag;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {
public static void main(String[] args) {
System.out.println("后端设计模式课程start---");
ACourse designPatternCourse = new BackEndCourse();
designPatternCourse.makeCourse();
System.out.println("后端设计模式课程end---");


System.out.println("前端课程start---");
ACourse feCourse = new FECourse(false);
feCourse.makeCourse();
System.out.println("前端课程end---");
}
}

输出:

后端设计模式课程start—
制作PPT
制作视频
编写课堂笔记
提供课程Java源代码
后端设计模式课程end—
前端课程start—
制作PPT
制作视频
提供课程的前端代码
提供课程的图片等多媒体素材
前端课程end—


模版方法模式
http://example.com/模版方法模式/
作者
Panyurou
发布于
2023年10月4日
许可协议