模板方法模式

模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤

类图如下:

模板方法定义
模板方法定义

这里以煮咖啡和茶的代码作为示例

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
// 抽象类Beverage提供了一个prepareRecipe()方法,其中有四个步骤,烧水喝倒入杯子是具体的实现,而冲泡和添加调料则根据不同的子类实现而不同,则定义为抽象的。
public abstract class Beverage {
final void prepareRecipe(){
// 烧水
boliWater();
// 冲泡
brew();
//倒入杯子
pourInCup();
//添加调料
addCondiments();
}
protected abstract void addCondiments();
private void pourInCup() {
log.info("Pouring into cup");
}
protected abstract void brew();
private void boliWater() {
log.info("boiling water...");
}
}
// 咖啡实现类
public class Coffee extends Beverage {
@Override
protected void addCondiments() {
log.info("Adding Sugar and Milk...");
}
@Override
protected void brew() {
log.info("Dripping Coffe through filter");
}
}
// 茶的实现类
public class Tea extends Beverage {
@Override
protected void addCondiments() {
log.info("Adding Lemon...");
}
@Override
protected void brew() {
log.info("Steeping the tea...");
}
}

prepareRecipe方法就是我们的模板方法,为什么?
因为:

  1. 他是一个方法
  2. 它用作一个算法的模板,在这个例子中,算法是用来制作饮料的

模板方法定义了一个算法的步骤,并允许子类为一个或者多个步骤提供实现