在一個方法中定義了一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠在不改變算法結構的狀況下,從新定義算法中的某些步驟。java
是一種重要的代碼複用
的重要技巧。從實現的角度來講,這符合封裝變化
的思想。同時,鉤子
是被聲明在抽象類中,可是只有空的
或者默認
的算法實現,由子類決定是否進行覆蓋,對算法的不一樣點進行掛鉤。當兩個或多個類執行的操做能夠抽象爲統一的步驟算法,只是在每步細節的實現上有差別,則能夠依賴模板方法構造一種繼承體系(有變化就封裝繼承體系)算法
模板 = 方法 = 一組步驟(任何步驟均可以是抽象的,由子類負責實現)這能夠確保算法的結構保持不變,同時由子類提供實現。spa
類圖以下:]code
hook是對那些子類能夠選擇實現的功能,在抽像類中給出一個簡單的默認實現,讓子類決定去不去覆蓋
這裏涉及到兩個角色:
抽象模板繼承
具體模板ip
javaabstract class AbstractClass{ final void templateMethod(){ primitiveOperation1(); primitiveOperation2(); concreteOperation(); hook(); } // 聲明爲final 以避免子類改變這個算法的順序 abstract void primitiveOperation1(); // 子類實現 abstract void primitiveOperation2(); // 子類實現 void concreteOperation(){ } void hook(){} }
什麼時候使用抽象方法?什麼時候使用hook?
當你的子類必須提供算法中某個步驟的實現時,就用抽象方法;
若是算法中這個步驟是可選的,就用hook. 經過使用鉤子,讓抽象類的子類的負荷減輕ituit