模板方法(Template Method)
# 模板方法(Template Method)
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
- 模板方法模式(Template Method Pattern),又叫模板模式 (Template Pattern),z 在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
- 简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
- 这种类型的设计模式属于行为型模式

抽象类 / 抽象模板(Abstract Class)
/**
* 1. 定义模板
*/
public abstract class CookTemplate {
/**
* 定义算法
*/
public void cook() {
/**
* 定义算法步骤:定义好了模板
* 父类可以实现某些步骤
* 留关键给子类
*/
heating();
addFood();
addSalt();
strifry();
end();
}
// 加热方法
public void heating() {
System.out.println("开火...");
}
// 添加食物
public abstract void addFood();
// 加盐
public abstract void addSalt();
//翻炒
public void strifry() {
System.out.println("翻炒中");
}
//出锅
public void end() {
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
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
具体子类 / 具体实现(Concrete Class)
public class AutoCookMachine extends CookTemplate {
@Override
public void addFood() {
System.out.println("放了三颗小白菜");
}
@Override
public void addSalt() {
System.out.println("放了一勺盐");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
测试
public class MainTest {
public static void main(String[] args) {
AutoCookMachine autoCookMachine = new AutoCookMachine();
autoCookMachine.cook();
}
}
1
2
3
4
5
6
2
3
4
5
6
# 应用场景
什么场景用到?
- Spring 的整个继承体系都基本用到模板方法;
- BeanFactory.getBean (1,2,3,4)--A1---A2---A3---A4(全部被完成)
- JdbcTemplate、RedisTemplate 都允许我们再扩展.....
- 我们自己的系统也应该使用模板方法组织类结构
Spring IOC 容器初始化时运用到的模板方法模式


# 注意事项和细节
- 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
- 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
- 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
- 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
- 一般模板方法都加上 final 关键字, 防止子类重写模板方法.
- 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02