模板方法模式:在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟
代碼:
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:好萊塢原則:別調用我們,我們會調用你
爲的是防止“依賴腐敗”。依賴腐敗情況,高層組件依賴低層組件,低層組件依賴高層組件,高層組件又依賴邊側組件,邊側組件又依賴低層組件,系統難以理解
鉤子是運行低層組件掛鉤到高層,但是由高層決定什麼時候調用,防止腐敗
比較模板方法模式、策略模式、工廠方法:
模板方法:子類決定如何實現算法中的步驟
策略:封裝可互換的行爲,然後使用委託來決定要採用哪一個行爲
工廠方法:由子類決定實例化哪個具體類