Java 中的模板方法設計模式

模板方法是一种行为设计模式。模板方法设计模式用于创建方法存根,并将部分实现步骤推迟到子类中。

模板方法设计模式

模板方法定义了执行算法的步骤,并可以提供默认实现,这可能适用于所有或部分子类。让我们通过一个例子来理解这个模式,假设我们想要提供一个构建房屋的算法。构建房屋需要执行的步骤包括建造地基、建造柱子、建造墙壁和窗户。重要的一点是,我们不能改变执行顺序,因为我们不能在建造地基之前建造窗户。因此,在这种情况下,我们可以创建一个模板方法,使用不同的方法来构建房屋。现在,为房屋建造地基对于所有类型的房屋都是相同的,无论是木屋还是玻璃屋。因此,我们可以为此提供基本实现,如果子类想要覆盖这个方法,它们可以这样做,但大多数情况下,这对于所有类型的房屋都是共同的。为了确保子类不会覆盖模板方法,我们应该将其声明为 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的所有非抽象方法。

模板方法設計模式重點

  1. 模板方法應該包含某些步驟,其順序固定,對於某些方法,從基類到子類的實現有所不同。模板方法應該是 final。
  2. 大多數情況下,子類別呼叫超類別的方法,但在模板模式中,超類別的模板方法呼叫子類別的方法,這被稱為 好萊塢原則 – “別找我,我們會找你。”。
  3. 具有默認實現的基類中的方法被稱為 鉤子,它們旨在被子類覆蓋,如果您希望某些方法不被覆蓋,可以將它們設置為final,在我們的例子中,我們可以將buildFoundation()方法設置為final,因為如果我們不希望子類覆蓋它。

這就是關於Java中模板方法設計模式的全部,希望您喜歡。

Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java