設計模式(十五)
什麼是模板方法模式
在生活中有些事情的流程是一致的,只是其中的某些步驟不一致,這就是一個模板,比如銀行辦理業務.
進門取號 ----> 填寫單據 ----> 等待叫好 ----> 視窗辦理
填寫單據這一步驟就是不同的地方.
專案中的模板方法模式:一個抽象類中,有一個主方法,在定義多個方法,可以是抽象的,也可以是實際的方法,定義一個類,繼承該抽象類,重寫抽象方法,不同子類的重寫內容可以不同,通過呼叫抽象類,實現對子類的呼叫.
如何實現模板方法模式
例子:
泡咖啡:把水煮沸 --> 沸水沖泡咖啡 --> 咖啡倒進杯子 --> 加糖加奶
泡茶:把水煮沸 --> 沸水浸泡茶葉 --> 茶倒進杯子 --> 加檸檬
分析:沖泡和浸泡都是泡,加糖加奶加檸檬都是加料
建立一個抽象類,在裡面定義模版方法和其他的方法
public abstract class BubbleBeverage { //定義模版方法,注意需要final修飾,不允許外界修改模版框架 public final void beverageTemplate(){ //1.煮沸水 boilWater(); //2.泡製 brew(); //3.倒入杯子 pourInCup(); //4.加料 addSomething(); } //需要在子類中實現的方法 protected abstract void addSomething(); private void pourInCup() { System.out.println("將飲料倒入杯子中"); } //需要在子類中實現的方法 protected abstract void brew(); private void boilWater() { System.out.println("將水煮沸"); } } 模版類的子類 子類A: //定義一個子類實現茶的泡製 public class TeaBeverage extends BubbleBeverage{ @Override protected void addSomething() { System.out.println("加檸檬"); } @Override protected void brew() { System.out.println("用沸水浸泡茶葉"); } 子類B: import cn.wxdl.abstracts.BubbleBeverage; //定義一個子類實現咖啡的製備 public class CoffeeBeverage extends BubbleBeverage{ @Override protected void addSomething() { System.out.println("加糖加奶"); } @Override protected void brew() { System.out.println("用沸水沖泡咖啡"); } } 測試類: public class TestDemo { public static void main(String[] args) { testCoffee(); System.out.println("-------------------------"); testTea(); } public static void testCoffee(){ BubbleBeverage beverage = new CoffeeBeverage(); System.out.println("開始製備咖啡"); beverage.beverageTemplate(); System.out.println("咖啡製備完成"); } public static void testTea(){ BubbleBeverage beverage = new TeaBeverage(); System.out.println("開始泡製茶"); beverage.beverageTemplate(); System.out.println("茶泡製完成"); } } 複製程式碼
模板方法模式的特點
演算法或操作遵循相似的邏輯
重構時(將相同的程式碼抽取到父類中)
重要,複雜的演算法,核心演算法設計為模版演算法
優點:
1.封裝性好
2.複用性好
3.遮蔽細節
4.便於維護
總結
模版方法模式的實現要素:抽象基類和具體子類
抽象基類中有共性的方法(已實現)和抽象方法(只知道原則不知道細節),還有模版方法