在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠在不改變算法結構的狀況下,才從新定義算法中的某些步驟java
普通模板設計模式算法
/** * 咖啡因飲料 * * @author Colin * @create 2018-05-14 **/ public abstract class CaffeineBeverage { final void prepareRecipe(){ boilWater(); brew(); pourIntoCup(); addCondiments(); } abstract void brew(); abstract void addCondiments(); void boilWater(){ System.out.println("燒水"); } void pourIntoCup(){ System.out.println("飲料倒入杯子中"); } } /** * 咖啡 * * @author Colin * @create 2018-05-14 **/ public class Coffee extends CaffeineBeverage { @Override void brew() { System.out.println("沖泡咖啡"); } @Override void addCondiments() { System.out.println("加糖和牛奶"); } } /** * 茶 * * @author Colin * @create 2018-05-14 **/ public class Tea extends CaffeineBeverage { @Override void brew() { System.out.println("沖泡茶葉"); } @Override void addCondiments() { System.out.println("什麼也不放"); } }
帶鉤子的模板設計模式,子類能夠重寫customerWantsCondiments控制父類模板方法設計模式
/** * 帶鉤子的飲料基類 * * @author Colin * @create 2018-05-14 **/ public abstract class CaffeineBeverageWithHook { final void prepareRecipe(){ boilWater(); brew(); pourIntoCup(); if (customerWantsCondiments()){ addCondiments(); } } abstract void brew(); abstract void addCondiments(); void boilWater(){ System.out.println("燒水"); } void pourIntoCup(){ System.out.println("飲料倒入杯子中"); } boolean customerWantsCondiments(){ return true; } }
鉤子是一種方法,它在抽象類中不作事,子類能夠選擇要不要去覆蓋它ide
涉及原則,好萊塢原則,咱們容許低層組件將本身掛鉤到系統上,可是高層組件會決定何時和怎樣使用這些低層組件。設計
別調用咱們,咱們會調用你code