Design Patterns(十二) Template Method

Template method design pattern is to define an algorithm as skeleton of operations and leave the details to be implemented by the child classes. The overall structure and sequence of the algorithm is preserved by the parent class.

前言

    模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。在软件工程中,它是一种软件设计模式,和C++模板没有关连。

模板方法模式

基本介绍:

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

模板方法模式-UML图:


模板方法模式-类图:



代码:

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
77
78
79
80
81
82
83
84
85
86
87
/**
* @Auther: Arsenal
* @Date: 2020-03-18 0:40
* @Description: 模板方法模式
*/
public class TemplateMethod {
public static void main(String[] args) {

Game football = new Football("足球");
Game basketball = new Basketball("篮球");

football.play();
System.out.println("===========分割线===========");
basketball.play();
}
}

/**
* 抽象类, 类中实现了模板方法
*/
abstract class Game {
String gameName;

public Game(String gameName) {
this.gameName = gameName;
}

void warmup() {
System.out.println(gameName + "运动员热身");
}

void start() {
System.out.println(gameName + "比赛开始");
}

//抽象方法, 子类具体实现
abstract void stop();

void end() {
System.out.println(gameName + "比赛结束");
}

//钩子方法,决定是否需要暂停
boolean isStop() {
return true;
}

final void play() {
warmup();
start();
if (isStop()) {
stop();
}
end();
}

}

class Football extends Game {

public Football(String gameName) {
super(gameName);
}

//实现抽象方法
@Override
void stop() {

}

@Override
boolean isStop() {
return false;
}
}

class Basketball extends Game {

public Basketball(String gameName) {
super(gameName);
}

@Override
void stop() {
System.out.println(super.gameName + "比赛可以暂停");
}
}

总结

模板方法模式的注意事项和细节:

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

延伸

    模板方法模式
    模板模式-菜鸟教程
    Design Patterns - Template Pattern
    模板方法模式(模板方法设计模式)详解
    尚硅谷Java设计模式,韩顺平图解java设计模式

Content
  1. 1. 前言
  2. 2. 模板方法模式
  3. 3. 总结
  4. 4. 延伸