模板方法设计模式
模板方法是一种行为设计模式。模板方法设计模式用于创建方法存根,并将一些实现步骤推迟到子类。
目录[ 隐藏 ]
模板方法设计模式
Template方法定义了执行算法的步骤,它可以提供可能对所有或部分子类通用的默认实现。
让我们通过一个例子来理解这个模式,假设我们想要提供一个算法来构建一个房子。建造房屋需要采取措施 - 建筑基础,建筑支柱,建筑墙壁和窗户。重要的是,我们不能改变执行的顺序,因为我们无法在构建基础之前构建窗口。所以在这种情况下,我们可以创建一个模板方法,使用不同的方法来构建房子。
现在为所有类型的房屋建造房屋的基础是相同的,无论是木屋还是玻璃房。所以我们可以为此提供基本实现,如果子类想要覆盖这个方法,它们可以但主要是所有类型的房屋都是常见的。
为了确保子类不会覆盖模板方法,我们应该将其设为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的所有非抽象方法。
模板方法设计模式重点
- 模板方法应该由某些步骤组成,其顺序是固定的,对于某些方法,实现不同于基类到子类。模板方法应该是最终的。
- 大多数情况下,子类从超类调用方法,但在模板模式中,超类模板方法从子类调用方法,这被称为好莱坞原则 - “不要打电话给我们,我们会打电话给你。”。
- 具有默认实现的基类中的方法称为Hooks,它们旨在被子类覆盖,如果您想要不覆盖某些方法,可以将它们设为final,例如在我们的例子中我们可以生成buildFoundation()方法final,因为如果我们不希望子类覆盖它。
这就是java中的模板方法设计模式,我希望你喜欢它。
转载来源:https://www.journaldev.com/1763/template-method-design-pattern-in-java