模板方法是一种行为设计模式。模板方法设计模式用于创建方法存根,并将部分实现步骤推迟到子类中。
模板方法设计模式
模板方法定义了执行算法的步骤,并可以提供默认实现,这可能适用于所有或部分子类。让我们通过一个例子来理解这个模式,假设我们想要提供一个构建房屋的算法。构建房屋需要执行的步骤包括建造地基、建造柱子、建造墙壁和窗户。重要的一点是,我们不能改变执行顺序,因为我们不能在建造地基之前建造窗户。因此,在这种情况下,我们可以创建一个模板方法,使用不同的方法来构建房屋。现在,为房屋建造地基对于所有类型的房屋都是相同的,无论是木屋还是玻璃屋。因此,我们可以为此提供基本实现,如果子类想要覆盖这个方法,它们可以这样做,但大多数情况下,这对于所有类型的房屋都是共同的。为了确保子类不会覆盖模板方法,我们应该将其声明为 final。
模板方法抽象类
由於我們希望一些方法由子類實現,所以我們必須將基類設置為抽象類。HouseTemplate.java
package com.journaldev.design.template;
public abstract class HouseTemplate {
//模板方法,使用final關鍵字以防止子類覆蓋
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