引入

在之前的文章中我们介绍了常见的设计模式,今天我们来使用 Java 语言对模板方法模式进行具体实现举例。

实例

在下面的例子中,我们使用模板方法模式来对子类共有的方法或者方法逻辑进行抽象,就像预先设计一个模板一样,下面采用抽象类来举例,但是采用接口也可以做到类似的效果(JDK8之后接口支持default方法),我们以游戏来作为例子(手动狗头):

模板抽象类

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
30
31
32
33
34
35
36
37
38
39
40
41
/**
* 游戏模板
*
* @author marx
* @date 2022/03/21
*/
static abstract class GameTemplate {
/**
* 开始
*/
abstract void init();
/**
* 玩
*/
abstract void start();
/**
* 结束
*/
abstract void end();

/**
* 玩游戏
* 此处就是预先定义好的方法逻辑
* 子类不可重写修改
*/
public final void play() {
init();
load();
start();
end();
}

/**
* 加载
* 这是模板抽象类预先设定好的模板方法
* 子类可以重写修改
*/
void load() {
System.out.println("正在加载数据");
}
}

子类实现类

可以看到我们的子类简化了很多公共的部分,更加整洁清晰了。

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
30
31
32
33
34
35
36
37
38
39
40
41
/**
* 原神
*
* @author marx
* @date 2022/03/21
*/
static class Genshin extends GameTemplate {
@Override
void init() {
System.out.println("原神");
}
@Override
void start() {
System.out.println("启动");
}
@Override
void end() {
System.out.println("提瓦特大陆的星空永远会有你的位置");
}
}

/**
* 腾讯
*
* @author marx
* @date 2022/03/21
*/
static class Tencent extends GameTemplate {
@Override
void init() {
System.out.println("TiMi");
}
@Override
void start() {
System.out.println("开始游戏");
}
@Override
void end() {
System.out.println("你充Q币吗?");
}
}