模板方法模式(Template Method Pattern)

模板方法模式:在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟


代碼:

public abstract class CaffeineBeverage {

	public void prepareRecipe() {
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}
	
	public void boilWater() {
		System.out.println("Boiling water");
	}
	
	public void pourInCup() {
		System.out.println("Pouring into cup");
	}
	
	public abstract void brew();
	
	public abstract void addCondiments();
}

public class Coffee extends CaffeineBeverage {

	@Override
	public void brew() {
		System.out.println("Dripping Coffee");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding Sugar and Milk");
	}
}

public class Tea extends CaffeineBeverage {

	@Override
	public void brew() {
		System.out.println("Steeping the tea");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding lemon");
	}
}

public class PatternDemo {
	
	public static void main(String[] args) {
		Tea tea = new Tea();
		tea.prepareRecipe();
		
		Coffee coffee = new Coffee();
		coffee.prepareRecipe();
	}
}


鉤子(hook):允許子類控制父類的算法框架中的某個步驟是否被調用

public abstract class CaffeineBeverage {

	public void prepareRecipe() {
		boilWater();
		brew();
		pourInCup();
		if (condiments()) {
			addCondiments();
		}
	}
	
	public void boilWater() {
		System.out.println("Boiling water");
	}
	
	public void pourInCup() {
		System.out.println("Pouring into cup");
	}
	
	public boolean condiments() {
		return true;
	}
	
	public abstract void brew();
	
	public abstract void addCondiments();
}

方法condiments就是一個hook,默認情況下返回true,加入調料,只要在子類覆蓋這個方法,那麼就可以修改返回值,控制是否加調料。

修改Tea:

public class Tea extends CaffeineBeverage {

	@Override
	public void brew() {
		System.out.println("Steeping the tea");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding lemon");
	}

	@Override
	public boolean condiments() {
		return false;
	}
}

現在運行結果就會變成Tea是不加調料的。


設計原理8:好萊塢原則:別調用我們,我們會調用你

爲的是防止“依賴腐敗”。依賴腐敗情況,高層組件依賴低層組件,低層組件依賴高層組件,高層組件又依賴邊側組件,邊側組件又依賴低層組件,系統難以理解


鉤子是運行低層組件掛鉤到高層,但是由高層決定什麼時候調用,防止腐敗


比較模板方法模式、策略模式、工廠方法:

模板方法:子類決定如何實現算法中的步驟

策略:封裝可互換的行爲,然後使用委託來決定要採用哪一個行爲

工廠方法:由子類決定實例化哪個具體類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章