模板方法是一个 行为设计模式. 模板方法设计模式用于创建方法支架,并将一些实施步骤推迟到子类。
模板方法设计模式
模板方法定义了执行一个算法的步骤,它可以提供默认的实施,这可能是所有或部分子类的共同点。让我们以一个例子来理解这个模式,假设我们想要提供一个算法来建造一所房子。 需要执行的步骤是建造一所房子 - 建造基础,建造柱子,建造墙壁和窗户。 重要的是,我们不能改变执行顺序,因为我们不能建造窗户建造基础之前。 所以在这种情况下,我们可以创建一个模板方法,将使用不同的方法来建造房子。 现在建造房子的基础是相同的所有类型的房子,无论是木制房子还是玻璃房子。 所以我们可以为此提供实施基础,如果子类想要超越这种方法,他们可以但大多是所有类型的房子共同的。 为了确保子类
模板方法 抽象类
由于我们希望某些方法由子类实现,所以我们必须将我们的基础类作为 [抽象类]( / 社区 / 教程 / 抽象类-in-java "Java 中的抽象类").
1package com.journaldev.design.template;
2
3public abstract class HouseTemplate {
4
5 //template method, final so subclasses can't override
6 public final void buildHouse(){
7 buildFoundation();
8 buildPillars();
9 buildWalls();
10 buildWindows();
11 System.out.println("House is built.");
12 }
13
14 //default implementation
15 private void buildWindows() {
16 System.out.println("Building Glass Windows");
17 }
18
19 //methods to be implemented by subclasses
20 public abstract void buildWalls();
21 public abstract void buildPillars();
22
23 private void buildFoundation() {
24 System.out.println("Building foundation with cement,iron rods and sand");
25 }
26}
「buildHouse()」是模板方法,定义了执行多个步骤的执行顺序。
模板方法 具体类
我们可以有不同的类型的房子,如木屋和玻璃屋。
1package com.journaldev.design.template;
2
3public class WoodenHouse extends HouseTemplate {
4
5 @Override
6 public void buildWalls() {
7 System.out.println("Building Wooden Walls");
8 }
9
10 @Override
11 public void buildPillars() {
12 System.out.println("Building Pillars with Wood coating");
13 }
14
15}
我们也可能忽略了其他方法,但为了简单,我不这么做。
1package com.journaldev.design.template;
2
3public class GlassHouse extends HouseTemplate {
4
5 @Override
6 public void buildWalls() {
7 System.out.println("Building Glass Walls");
8 }
9
10 @Override
11 public void buildPillars() {
12 System.out.println("Building Pillars with glass coating");
13 }
14
15}
模板方法设计模板客户端
让我们用测试程序测试我们的模板方法模式示例。 HousingClient.java
1package com.journaldev.design.template;
2
3public class HousingClient {
4
5 public static void main(String[] args) {
6
7 HouseTemplate houseType = new WoodenHouse();
8
9 //using template method
10 houseType.buildHouse();
11 System.out.println("************");
12
13 houseType = new GlassHouse();
14
15 houseType.buildHouse();
16 }
17
18}
请注意,客户端正在调用基于类的模板方法,并根据执行不同的步骤,它正在使用一些基于类的方法,其中一些来自子类。
1Building foundation with cement,iron rods and sand
2Building Pillars with Wood coating
3Building Wooden Walls
4Building Glass Windows
5House is built.
6************
7Building foundation with cement,iron rods and sand
8Building Pillars with glass coating
9Building Glass Walls
10Building Glass Windows
11House is built.
模板方法 班级图表
JDK 中的模板方法设计模式
- java.io.InputStream、 java.io.OutputStream、 java.io.Reader 和 java.io.Writer 的所有非抽象方法
- java.util.AbstractList、 java.util.AbstractSet 和 java.util.AbstractMap 的所有非抽象方法
模板方法 设计模式 重要点
- 模板方法应该由某些步骤组成,其顺序是固定的,对于某些方法,实现是从基础类别到子类别的。 模板方法应该是最终的.
- 大多数时候,子类呼叫从超级类别的方法,但在模板模式中,超级类模板方法呼叫从子类别的方法,这被称为 好莱坞原则 -
不要叫我们,我们会叫你
。 - 默认实现的基层类别中的方法被称为 Hooks,并且它们旨在被子类覆盖,如果你想要某些方法不被覆盖,你可以使它们最终,例如在我们的情况下,我们可以使构建基础()方法最终,因为如果我们不希望子类
这就是Java中的模板方法设计模式,我希望你喜欢它。