设计模式之模板方法模式

定义

1
定义一个操作中的算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的特定步骤。

优点

1
减少代码冗余,避免重复代码

代码

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
package template;

// 抽象类,定义了模板方法
abstract class Beverage {
// 模板方法,定义了制作饮料的算法步骤
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}

// 具体步骤
void boilWater() {
System.out.println("煮水");
}

void pourInCup() {
System.out.println("倒入杯中");
}

// 抽象方法,子类必须实现
abstract void brew();

abstract void addCondiments();
}

// 具体子类,实现具体步骤
class Tea extends Beverage {
@Override
void boilWater() {
System.out.println("烧开水");
}
@Override
void brew() {
System.out.println("泡茶");
}

@Override
void addCondiments() {
System.out.println("加柠檬");
}
}

// 另一个具体子类,实现具体步骤
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("滴滤咖啡");
}

@Override
void addCondiments() {
System.out.println("加糖和牛奶");
}
}

// 测试类
public class TemplateMethodExample {
public static void main(String[] args) {
Beverage tea = new Tea();
Beverage coffee = new Coffee();

System.out.println("制作茶:");
tea.prepareRecipe();

System.out.println("\n制作咖啡:");
coffee.prepareRecipe();
}
}