Java 中的模板方法设计模式
模板方法是一种行为设计模式。模板方法设计模式用于创建方法存根并将某些实现步骤推迟到子类。
模板方法设计模式
模板方法定义了执行算法的步骤,它可以提供所有或部分子类通用的默认实现。让我们通过一个例子来理解这种模式,假设我们想提供一种建造房屋的算法。建造房屋需要执行的步骤是 - 打地基、建柱子、建墙壁和窗户。重要的一点是我们不能改变执行的顺序,因为我们不能在打地基之前建窗户。所以在这种情况下我们可以创建一个模板方法,使用不同的方法来建造房屋。现在,建造房屋地基的方法对于所有类型的房屋都是一样的,无论是木屋还是玻璃屋。所以我们可以为此提供基本实现,如果子类想要重写这个方法,他们可以,但大多数情况下它对所有类型的房屋都是通用的。为了确保子类不会重写模板方法,我们应该将其设为 final。
模板方法抽象类
由于我们希望某些方法由子类实现,因此我们必须将基类设为抽象类。HouseTemplate.java
package com.journaldev.design.template;
public abstract class HouseTemplate {
//template method, final so subclasses can't override
public final void buildHouse(){
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
//default implementation
private void buildWindows() {
System.out.println("Building Glass Windows");
}
//methods to be implemented by subclasses
public abstract void buildWalls();
public abstract void buildPillars();
private void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
}
buildHouse()
是模板方法,定义了执行几个步骤的执行顺序。
模板方法具体类
我们可以拥有不同类型的房子,例如木房和玻璃房。WoodenHouse.java
package com.journaldev.design.template;
public class WoodenHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Wooden Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with Wood coating");
}
}
我们也可以覆盖其他方法,但为了简单起见,我没有这样做。GlassHouse.java
package com.journaldev.design.template;
public class GlassHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Glass Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with glass coating");
}
}
模板方法设计模式客户端
让我们用测试程序来测试我们的模板方法模式示例。HousingClient.java
package com.journaldev.design.template;
public class HousingClient {
public static void main(String[] args) {
HouseTemplate houseType = new WoodenHouse();
//using template method
houseType.buildHouse();
System.out.println("************");
houseType = new GlassHouse();
houseType.buildHouse();
}
}
请注意,客户端正在调用基类的模板方法,并且根据不同步骤的实现,它使用一些来自基类的方法,一些来自子类的方法。上述程序的输出为:
Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.
模板方法类图
JDK中的模板方法设计模式
- java.io.InputStream、java.io.OutputStream、java.io.Reader 和 java.io.Writer 的所有非抽象方法。
- java.util.AbstractList、java.util.AbstractSet 和 java.util.AbstractMap 的所有非抽象方法。
模板方法设计模式重点
- 模板方法应由某些步骤组成,这些步骤的顺序是固定的,并且对于某些方法,其实现在基类和子类之间有所不同。模板方法应该是 final 的。
- 大多数情况下,子类会调用超类的方法,但在模板模式中,超类模板方法会调用子类的方法,这被称为好莱坞原则- “不要打电话给我们,我们会打电话给你”。
- Methods in base class with default implementation are referred as Hooks and they are intended to be overridden by subclasses, if you want some of the methods to be not overridden, you can make them final, for example in our case we can make buildFoundation() method final because if we don’t want subclasses to override it.
Thats all for template method design pattern in java, I hope you liked it.