首頁歷史 > 正文

優秀程式設計師必備技能:設計模式之——模板模式

2021-12-25由 程式設計小菜鳥 發表于 歷史

基本介紹

模板模式也被稱為“模板方法模式”,該模式是

行為型模式

的一種,模板模式相對來說比較簡單也比較容易理解。

該模式的實現思路是:在一抽象類中定義一個

公開的模板方法

,該方法規定了某一演算法(也可稱為功能)的執行流程,其子類可以按照需求重寫類中的其它方法,但是整個演算法將以模板方法定義的流程進行。

換言之,模板方法規定了一個演算法的整體骨架(執行流程),並將一些具體步驟延遲到子類中,從而促使子類可以在不改變演算法結構的前提下,就能做到重新定義該演算法的一些特定操作。

通常情況下我們會在模板方法所在的父類中定義一個方法,該方法預設不做任何事情,子類可以根據自身情況重寫它,此方法被稱為“

鉤子方法

”。鉤子方法在模板模式中可有可無,不是必須存在的。

模板模式的UML類圖

優秀程式設計師必備技能:設計模式之——模板模式

類圖講解

AbstractClass:抽象父類,定義並實現了模板方法,規定好了演算法的執行流程。該類中也會存在一些其它抽象方法,用於讓子類定製屬於自己的特殊操作。

ConcreteClassA、ConcreteClassB:繼承AbstractClass抽象類並實現該類中的抽象方法。

Client:客戶端測試類。

案例講解

咖啡製作

流程:挑選咖啡豆 => 研磨 => 沖泡 => 新增配料。

配料:牛奶、糖。

程式碼實現

咖啡 => 對應AbstractClass

public abstract class Coffee { /** * 模板方法,使用final修飾,不讓子類重寫。 該方法定義了咖啡的製作過程。 */ public final void make() { this。select(); this。grind(); this。infusion(); if (this。customerWantCondiments()) { this。addCondiments(); } } // 挑選材料 private void select() { System。out。println(“挑選好優質的咖啡豆!”); } // 研磨 private void grind() { System。out。println(“將咖啡豆研磨成粉!”); } // 沖泡 private void infusion() { System。out。println(“沖泡咖啡!”); } // 新增配料。定義成抽象方法,讓不同子類實現新增不同的配料。 public abstract void addCondiments(); /** * 是否需要新增配料。“鉤子方法” */ public boolean customerWantCondiments() { return true; }}

不同口味的咖啡 => 對應AbstractClass的子類

/** * 加奶咖啡 */public class WhiteCoffee extends Coffee { @Override public void addCondiments() { System。out。println(“新增牛奶!”); }}/** * 加糖咖啡 */public class WithSugarCoffee extends Coffee { @Override public void addCondiments() { System。out。println(“新增糖!”); }}/** * 純咖啡 */public class PureCoffee extends Coffee { @Override public void addCondiments() { } // 重寫鉤子方法 @Override public boolean customerWantCondiments() { return false; }}

客戶端測試類

public class Cilent { public static void main(String[] args) { System。out。println(“======製作加奶咖啡======”); Coffee whiteCoffee = new WhiteCoffee(); whiteCoffee。make(); System。out。println(“======製作加糖咖啡======”); Coffee withSugarCoffee = new WithSugarCoffee(); withSugarCoffee。make(); System。out。println(“======製作純咖啡======”); Coffee pureCoffee = new PureCoffee(); pureCoffee。make(); }}

執行結果

優秀程式設計師必備技能:設計模式之——模板模式

總結

1、演算法(流程)只存在於父類中,這樣有利於對演算法的修改與維護,只要變更父類就可以使其子類繼承相應的修改。

2、模板模式中父類的模板方法和一些已經實現的方法可以直接被子類使用,從而實現程式碼的最大化複用。

3、模板模式即統一了演算法(流程),也提供了很大的靈活性(像上面案例中新增配料一樣)。

4、缺點:每一個不同的實現都需要新增一個子類,會導致類的個數增加,使系統變得龐大。

5、注意:父類的模板方法一般都使用final修飾,從而防止子類重寫。

6、使用場景:當某一項功能是需要透過執行一系列操作來完成的,並且這一系列的操作基本相同,只有部分操作存在差異時我們就可以考慮使用模板方法。

今天的分享就到這裡了,如果感覺“菜鳥”寫的文章還不錯,記得

點贊

關注

呦!你們的支援就是我堅持下去的動力。文章哪裡寫的有問題的也希望大家可以指出,我會虛心受教。

優秀程式設計師必備技能:設計模式之——模板模式

頂部