模板方法是一种行为设计模式。模板方法设计模式用于创建方法存根,并将实现的一些步骤推迟到子类。
模板方法设计模式
模板方法定义了执行算法的步骤,并且可以提供默认实现,这些实现可能对所有或某些子类都是共同的。让我们通过一个例子来理解这种模式,假设我们想提供一个构建房屋的算法。构建房屋需要执行的步骤包括-建造基础、建造支柱、建造墙壁和窗户。重要的一点是,我们不能改变执行顺序,因为我们不能在建造基础之前建造窗户。所以在这种情况下,我们可以创建一个模板方法,该方法将使用不同的方法来建造房屋。现在,为房屋建造基础对于所有类型的房屋都是相同的,无论是木屋还是玻璃屋。因此,我们可以为此提供基本实现,如果子类想要重写此方法,他们可以,但大多数情况下,它对所有类型的房屋都是共同的。为了确保子类不会覆盖模板方法,我们应该将其设置为final。
模板方法抽象类
由于我们希望某些方法由子类实现,因此我们必须将基类设置为抽象类。HouseTemplate.java
package com.journaldev.design.template;
public abstract class HouseTemplate {
//模板方法,最终使得子类无法覆盖
public final void buildHouse(){
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
//默认实现
private void buildWindows() {
System.out.println("Building Glass Windows");
}
//由子类实现的方法
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();
//使用模板方法
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的。
模板方法设计模式的重要点
- 模板方法应包含一系列固定顺序的步骤,并且对于一些方法,实现从基类到子类不同。
- 大多数情况下,子类调用超类的方法,但在模板模式中,超类模板方法调用子类的方法,这就是好莱坞原则 – “别找我们,我们会找你的。”。
- 具有默认实现的基类中的方法被称为钩子,它们旨在由子类重写,如果你不希望某些方法被重写,可以将它们声明为final,例如在我们的例子中,我们可以将buildFoundation()方法声明为final,因为我们不希望子类重写它。
关于Java中的模板方法设计模式就介绍到这里,希望你喜欢。
Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java