《Head First設計模式》已經讀了不止一遍,可是始終沒有進行系統的進行總結。因此近期開始總結設計模式相關的知識,從模板方法模式開始,由於是一個我認爲是最簡單的設計模式。(推薦視頻資源23個設計模式)java
提出問題程序員
實現製做咖啡功能。且製做咖啡須要四個步驟 :算法
代碼實現設計模式
/** * 一杯加糖咖啡 * * @author Jann Lee * @date 2019-07-14 18:37 */ public class Coffee { /** * 製做一杯加糖咖啡 */ public void prepareRecipe() { boilWater(); steepTeaBag(); portInCup(); addLemon(); } /** * step1: 燒水 */ private void boilWater() { System.out.println("燒水..."); } /** * step2:沖泡咖啡 */ private void steepTeaBag() { System.out.println("沖泡咖啡..."); } /** * step3: 倒入杯中 */ private void portInCup() { System.out.println("倒入杯中..."); } /** * step4: 加糖 */ private void addLemon() { System.out.println("加糖..."); }
再次提出問題此時此刻我須要一杯檸檬茶呢?【燒水,沖泡茶包,倒入杯中,加檸檬】cookie
這個問題固然很簡單,咱們只須要如法炮製便可。框架
public class Tea { /** * 製做一杯檸檬茶 */ public void prepareRecipe(){ boilWater(); brewCoffeeGrinds(); portInCup(); addSugarAndMilk(); } /** * step1: 燒水 */ private void boilWater() { System.out.println("燒水..."); } /** * step2:沖泡咖啡 */ private void brewCoffeeGrinds() { System.out.println("沖泡茶包..."); } /** * step3: 倒入杯中 */ private void portInCup() { System.out.println("倒入杯中..."); } /** * step4: 加檸檬 */ private void addSugarAndMilk() { System.out.println("加入檸檬片..."); } }
思考ide
若是此時咱們又須要一杯不加檸檬的茶,加奶的咖啡...,固然咱們能夠按照上面方式從新依次實現便可。可是若是你是一個有經驗的程序員,或者你學習過設計模式。你可能會發現以上功能實現的步驟/流程固定,當需求發生變化時,只有小部分步驟有所改變。學習
根據面向對象程序的特色,既抽象,封裝,繼承,多態。咱們能夠對代碼進行抽象,將公共代碼提取到基類。咱們將咖啡和茶抽象成咖啡因飲料,將其中相同的兩步,燒水和倒入杯中再父類中實現,將沖泡和添加調料延遲到子類。優化
public abstract class CafeineBeverage { /** * 製做一杯咖啡因飲料 */ public void prepareRecipe() { boilWater(); brew(); portInCup(); addCondiments(); } /** * step1: 燒水 */ private void boilWater() { System.out.println("燒水..."); } /** * step2:沖泡 */ protected abstract void brew(); /** * step3: 入杯中 */ private void portInCup() { System.out.println("倒入杯中..."); } /** * step4: 加調料 */ protected abstract void addCondiments(); }
// 一杯加糖咖啡 public class CoffeeBeverage extends CafeineBeverage{ @Override protected void brew() { System.out.println("沖泡咖啡..."); } @Override protected void addCondiments() { System.out.println("加糖..."); } }
// 一杯檸檬茶 public class TeaBeverage extends CafeineBeverage { @Override protected void brew() { System.out.println("沖泡茶包..."); } @Override protected void addCondiments() { System.out.println("加檸檬..."); } }
若是按以上方式對代碼進行了優化,其實就實現了模板方法模式。一下是模板方法模式相關概念。網站
動機
定義
定義一個操做中算法的骨架(穩定),而將一些步驟延遲(變化)到子類。Template Method使得子類能夠不改變(複用)一個算法的結構,便可從新定義(override)該算法的特定步驟。
要點總結
類圖: