模板方法
模板方法又叫钩子回调,是比较场景的设计模式。模板即定义了一系列操作骨架,实现代码复用,对不同的实现定义了回调接口。
常见的使用场景有:
- 文件读取
- 打开io流
- 读取数据
- 关闭io流
- jdbc 事务操作
- 打开事务
- 执行数据库操作
- 提交或回滚事务
- redis 操作
- 获得连接
- 执行 redis 操作
- 关闭连接
在 spring 中可以查看JdbcTemplate
和RedisTemplate
的实现。
模板方法有两种实现方式有模板模式和回调函数两种。
分别用两种形式实现一个场景:泡茶喝泡咖啡的步骤非常相似:
- 烧开水
- 把水倒进杯子
- 往杯子加入原料(咖啡或者茶叶)
- 浸泡一段时间
# 模板模式
通过子类重写方法实现模板代码调用,在明确不需要继承其他类的情况下使用,因为java不支持多继承。
// 杯子
public class Cup {
private String water;
private String material;
public String getWater() {
return water;
}
public void setWater(final String water) {
this.water = water;
}
public String getMaterial() {
return material;
}
public void setMaterial(final String material) {
this.material = material;
}
@Override
public String toString() {
return "Cup{" +
"water='" + water + '\'' +
", material='" + material + '\'' +
'}';
}
}
public abstract class AbstractMakeDrink {
// 杯子
private final Cup cup = new Cup();
void boilWater() {
System.out.println("烧水");
}
abstract void addMaterial(Cup cup);
void pourInCup() {
System.out.println("把水倒进杯子");
cup.setWater("开水");
}
void soak() {
System.out.println("浸泡2分钟");
}
public Cup make() {
boilWater();
addMaterial(cup);
pourInCup();
soak();
System.out.println("[" + cup.getMaterial() + "]制作完成");
return cup;
}
}
public class MakeCoffee extends AbstractMakeDrink {
@Override
void addMaterial(final Cup cup) {
cup.setMaterial("咖啡");
System.out.println("把咖啡放进杯子");
}
}
public class MakeTea extends AbstractMakeDrink {
@Override
void addMaterial(final Cup cup) {
cup.setMaterial("茶");
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
测试类
public class TemplateApp {
public static void main(String[] args) {
MakeTea tea = new MakeTea();
System.out.println(tea.make());
MakeCoffee coffee = new MakeCoffee();
System.out.println(coffee.make());
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 回调函数
通过回调接口 + lambda 表达式实现。
public class MakeDrink {
// 杯子
private final Cup cup = new Cup();
void boilWater() {
System.out.println("烧水");
}
void pourInCup() {
System.out.println("把水倒进杯子");
cup.setWater("开水");
}
void soak() {
System.out.println("浸泡2分钟");
}
public Cup make(AddMaterialCallback callback) {
boilWater();
callback.add(cup);
pourInCup();
soak();
System.out.println("[" + cup.getMaterial() + "]制作完成");
return cup;
}
}
public interface AddMaterialCallback {
void add(Cup cup);
}
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
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
测试类
public class MakeDrinkApp {
public static void main(String[] args) {
MakeDrink makeDrink = new MakeDrink();
Cup tea = makeDrink.make(cup -> {
cup.setMaterial("茶");
System.out.println("把茶叶放进杯子");
});
System.out.println(tea);
Cup coffee = makeDrink.make(cup -> {
cup.setMaterial("咖啡");
System.out.println("把咖啡放进杯子");
});
System.out.println(coffee);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Last Updated: 2024/04/23, 01:30:37