Java 中的模板方法设计模式

模板方法是一个 行为设计模式. 模板方法设计模式用于创建方法支架,并将一些实施步骤推迟到子类。

模板方法设计模式

模板方法定义了执行一个算法的步骤,它可以提供默认的实施,这可能是所有或部分子类的共同点。让我们以一个例子来理解这个模式,假设我们想要提供一个算法来建造一所房子。 需要执行的步骤是建造一所房子 - 建造基础,建造柱子,建造墙壁和窗户。 重要的是,我们不能改变执行顺序,因为我们不能建造窗户建造基础之前。 所以在这种情况下,我们可以创建一个模板方法,将使用不同的方法来建造房子。 现在建造房子的基础是相同的所有类型的房子,无论是木制房子还是玻璃房子。 所以我们可以为此提供实施基础,如果子类想要超越这种方法,他们可以但大多是所有类型的房子共同的。 为了确保子类

模板方法 抽象类

由于我们希望某些方法由子类实现,所以我们必须将我们的基础类作为 [抽象类]( / 社区 / 教程 / 抽象类-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.

模板方法 班级图表

template method design pattern, template design pattern

JDK 中的模板方法设计模式

  • java.io.InputStream、 java.io.OutputStream、 java.io.Reader 和 java.io.Writer 的所有非抽象方法
  • java.util.AbstractList、 java.util.AbstractSet 和 java.util.AbstractMap 的所有非抽象方法

模板方法 设计模式 重要点

  1. 模板方法应该由某些步骤组成,其顺序是固定的,对于某些方法,实现是从基础类别到子类别的。 模板方法应该是最终的.
  2. 大多数时候,子类呼叫从超级类别的方法,但在模板模式中,超级类模板方法呼叫从子类别的方法,这被称为 好莱坞原则 - 不要叫我们,我们会叫你
  3. 默认实现的基层类别中的方法被称为 Hooks,并且它们旨在被子类覆盖,如果你想要某些方法不被覆盖,你可以使它们最终,例如在我们的情况下,我们可以使构建基础()方法最终,因为如果我们不希望子类

这就是Java中的模板方法设计模式,我希望你喜欢它。

Published At
Categories with 技术
comments powered by Disqus