常用設計模式系列(十四)—模板方法模式
第一節
前言
之前我完成了創建型設計模式和結構型設計模式,我們今天將踏入設計模式的第三章:行為型設計模式,你是否還記得什么是行為型設計模式嗎?行為型模式:用于描述類或對象之間怎樣相互協作共同完成單個對象都無法單獨完成的任務,以及怎樣分配職責。今天開始講解第一篇,模板方法模式,所謂模板,就是定義相同的模板規范,去構建固定行為與可擴展行為,每個可擴展行行為可以有自己的特點。
第二節
模板方法模式
模板方法模式(Template
Method):一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但調用將以抽象類中定義的方式進行。這種類型的設計模式屬于行為型模式。個人理解(Person
Understand):抽象類可以定義一些普通方法及抽象方法,普通方法按照自己的規范進行定義即定義流程,但是流程中的每個步驟都可以在子節點進行特例化處理,在上層定義規范,在下層在規范的基礎上進行特殊化處理。
模板方法模式構成:
小楊同學入職后,需要去銀行辦理一張工資卡,來到銀行后,銀行提供了兩種辦卡方式,第一為人工辦理、第二種為機器自助辦理,可根據自己的選擇完成辦卡。辦卡流程為:填寫個人身份信息、人像識別、密碼設置、簽名留存。使用機器和人工都可以完成卡的辦理。銀行所定義的開卡流程就是我們模板方法模式中的,抽象模板類用來定義流程,那么人工辦卡和機器自主辦卡則是兩種具體實現類。
第三節
代碼實現
1.編寫抽象模板類
package com.yang.templatemethod;/*** @ClassName AbstractOpenCar* @Description 抽象模板類-開卡* @Author IT小白架構師之路* @Date 2021/1/5* @Version 1.0**/
public abstract class AbstractOpenCar {//開卡public void openCar(String password){writeInfo();faceDistinguish();givePass(password);autograph();}/*** 填寫個人信息*/public abstract void writeInfo();/*** 人臉識別*/public void faceDistinguish(){System.out.println("識別人臉:人臉識別系統");}//設置密碼public void givePass(String password){System.out.println("設置密碼:密碼設置為"+password);}//簽名public abstract void autograph();}
2.編寫具體子類A
package com.yang.templatemethod;/*** @ClassName ArtificialOpen* @Description 人工開卡* @Author IT小白架構師之路* @Date 2021/1/5* @Version 1.0**/
public class ArtificialOpen extends AbstractOpenCar{@Overridepublic void writeInfo() {System.out.println("信息填寫:提供個人信息,銀行業務人員幫忙錄入");}@Overridepublic void autograph() {System.out.println("簽名確認:紙質簽名確認");}
}
3.編寫具體子類B
package com.yang.templatemethod;/*** @ClassName AutonomyOpen* @Description 機器自助開卡* @Author IT小白架構師之路* @Date 2021/1/5* @Version 1.0**/
public class AutonomyOpen extends AbstractOpenCar{@Overridepublic void writeInfo() {System.out.println("信息填寫:機器手動填寫個人信息");}@Overridepublic void autograph() {System.out.println("簽名確認:電子簽名確認");}
}
4.測試客戶端
package com.yang.templatemethod;/*** @ClassName Client* @Description 客戶端測試* @Author IT小白架構師之路* @Date 2021/1/5* @Version 1.0**/
public class Client {public static void main(String[] args) {AbstractOpenCar openCar = new ArtificialOpen();System.out.println("選擇人工開卡-----------");openCar.openCar("123789");System.out.println("結束人工開卡-----------");openCar = new AutonomyOpen();System.out.println();System.out.println("選擇自助開卡-----------");openCar.openCar("147258");System.out.println("結束自助開卡-----------");}
}
5.程序運行結果如下,程序使用銀行兩種開卡方式完成了模板方法模式
選擇人工開卡-----------
信息填寫:提供個人信息,銀行業務人員幫忙錄入
識別人臉:人臉識別系統
設置密碼:密碼設置為123789
簽名確認:紙質簽名確認
結束人工開卡-----------選擇自助開卡-----------
信息填寫:機器手動填寫個人信息
識別人臉:人臉識別系統
設置密碼:密碼設置為147258
簽名確認:電子簽名確認
結束自助開卡-----------
第四節
優缺點及適用場景
優點
1.模板模式既定義了固定的流程,又支持了擴展功能,將固定的不可修改的在父類定義,子類去實現擴展的功能。
2.父類提供的公共方法,也便于代碼復用
3.擴展的方法,父類不實現,交給了子類,子類可以通過繼承的方式增加功能,符合了設計模式中的開閉原則。
缺點
1.如果要定義不同的實現,則需要創建新的實現類,業務增多時會增加類的數量,增加了系統的復雜性。
2.因為是通過繼承實現的,如果父類增加新的流程規范(抽象方法),所有的子類都要修改源碼來實現。
適用場景
1.當需要一個父類定義流程規范,但需要子類去實現的算法,父類負責不變的模塊,子類負責擴展的模塊時。
2.需要控制子類的擴展時(定義規范)。
3.需要將多個子類中的公共模塊抽象提取出來到父類,解決代碼冗余時。
4.例如我們JavaWeb開發過程中使用的servlet、filter都是使用了模板方法。
掃描二維碼
關注我吧
IT小白架構師之路