Java中的模板方法设计模式
模板方法是一种行为设计模式。模板方法设计模式用于创建方法的存根,并将部分实现步骤推迟到子类中。
模板方法设计模式
模板方法定义了执行算法的步骤,并且可以提供默认实现,这些实现对于所有或部分子类可能是通用的。让我们通过一个例子来理解这个模式,假设我们想提供一个建造房屋的算法。建造房屋需要执行的步骤包括 – 建造地基、建造柱子、建造墙壁和窗户。重要的是,我们不能改变执行的顺序,因为我们不能在建造地基之前建造窗户。因此,在这种情况下,我们可以创建一个模板方法,该方法将使用不同的方法来建造房屋。现在,对于所有类型的房屋来说,建造地基是相同的,无论是木屋还是玻璃屋。因此,我们可以为此提供基本实现,如果子类想要重写此方法,他们可以这样做,但大多数情况下,它对于所有类型的房屋都是通用的。为了确保子类不重写模板方法,我们应该将其设置为final。
模板方法抽象类
由于我们希望一些方法由子类来实现,所以我们必须将基类定义为抽象类。HouseTemplate.java
package com.Olivia.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.Olivia.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.Olivia.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.Olivia.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中的模板方法设计模式
- All non-abstract methods of java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer.
- All non-abstract methods of java.util.AbstractList, java.util.AbstractSet and java.util.AbstractMap.
模板方法设计模式的重要要点
-
- 模板方法应该由一系列固定顺序的步骤组成,对于一些方法来说,基类和子类的实现是不同的。模板方法应该是final的。
-
- 大多数情况下,子类调用超类的方法,但在模板模式中,超类的模板方法调用子类的方法,这被称为好莱坞原则——“不要打电话给我们,我们会打电话给你。”
- 基类中具有默认实现的方法被称为钩子方法,它们可以被子类重写,如果你不希望某些方法被重写,可以将它们设为final,例如在我们的情况中,我们可以将buildFoundation()方法设为final,因为我们不想让子类重写它。
这就是关于Java中模板方法设计模式的全部内容,希望你喜欢。