1. 程式人生 > >Java設計模式 - 模板方法模式

Java設計模式 - 模板方法模式

Java設計模式 - 模板方法模式

定義一個演算法的骨架,並將一些步驟通過子類表達。
 

UML圖示

要點
1. 定義一個演算法的骨架 - 建立一個抽象類
2. 將一些步驟通過子類表達 - 子類繼承抽象類 賦予不同實現
 

模板方法應用例項

模板方法適用於那種總體處理流程不變,但是處理細節可能存在變化的例項。

例如,咖啡店製作咖啡時大致可以抽象成如下幾個步驟:研磨咖啡豆 - 沖泡咖啡 - 加配料 - 加糖 - 拿給顧客。當顧客需要正常拿鐵時,會在沖泡好咖啡後,加入純牛奶。而另一個客戶需要豆奶拿鐵時,則會加入豆奶拿鐵。利用模板方法模式簡單模擬這一過程。

-CoffeeOrder.java

public abstract class CoffeeOrder {

	public void makingCoffee(){
		GrindingCoffee();
		BrewingCoffee();
		AddIngredients();
		AddSuger();
		PassToCustormer();
	}
	
	public abstract void GrindingCoffee();
	
	public abstract void BrewingCoffee();
	
	public abstract void AddIngredients();
	
	public void AddSuger(){
		System.out.println("Adding suger for a latte");
	}
	
	public abstract void PassToCustormer();
}

- LatteCoffeeOrder.java


public class LatteCoffeeOrder extends CoffeeOrder {

	public void GrindingCoffee() {
		System.out.println("GrindingCoffee for a latte");
	}

	public void BrewingCoffee() {
		System.out.println("BrewingCoffee for a latte");
	}

	public void AddIngredients() {
		System.out.println("Add pure milk for a latte");
	}

	public void PassToCustormer() {
		System.out.println("Passing a latte for custormer");
	}

}

-SoyLatteCoffeeOrder.java


public class SoyLatteCoffeeOrder extends CoffeeOrder {

	public void GrindingCoffee() {
		System.out.println("GrindingCoffee for a soy latte");
	}

	public void BrewingCoffee() {
		System.out.println("BrewingCoffee for a soy latte");
	}

	public void AddIngredients() {
		System.out.println("Add pure milk for a soy latte");
	}

	public void PassToCustormer() {
		System.out.println("Passing a soy latte for custormer");
	}

}

- Application.java


public class Application {

	public static void main(String[] args){
		CoffeeOrder order1;
		CoffeeOrder order2;
		
		order1 = new LatteCoffeeOrder();
		order2 = new SoyLatteCoffeeOrder();
		
		order1.makingCoffee();
		order2.makingCoffee();
	}
}

鉤子方法

抽象類中定義的具體方法,給出了空實現或者預設實現,並且允許子類重寫(沒用final)。有時候鉤子方法會作為flag來對當前程式體狀態進行判斷。