Java模版方法模式

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述模板方法(Template Method)模式的:
  模板方法模式是類的行為模式。準(zhǔn)備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后聲明一些抽象方法來迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實(shí)現(xiàn)。這就是模板方法模式的用意。

模板方法模式的結(jié)構(gòu)

模板方法模式是所有模式中最為常見的幾個模式之一,是基于繼承的代碼復(fù)用的基本技術(shù)。
  模板方法模式需要開發(fā)抽象類和具體子類的設(shè)計師之間的協(xié)作。一個設(shè)計師負(fù)責(zé)給出一個算法的輪廓和骨架,另一些設(shè)計師則負(fù)責(zé)給出這個算法的各個邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本方法匯總起來的方法叫做模板方法(template method),這個設(shè)計模式的名字就是從此而來。
  模板方法所代表的行為稱為頂級行為,其邏輯稱為頂級邏輯。模板方法模式的靜態(tài)結(jié)構(gòu)圖如下所示:


這里涉及到兩個角色:

抽象模板(Abstract Template)角色有如下責(zé)任:

  • 定義了一個或多個抽象操作,以便讓子類實(shí)現(xiàn)。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。

  • 定義并實(shí)現(xiàn)了一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應(yīng)的抽象操作中,推遲到子類實(shí)現(xiàn)。頂級邏輯也有可能調(diào)用一些具體方法。

具體模板(Concrete Template)角色又如下責(zé)任:

  • 實(shí)現(xiàn)父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。

  • 每一個抽象模板角色都可以有任意多個具體模板角色與之對應(yīng),而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實(shí)現(xiàn),從而使得頂級邏輯的實(shí)現(xiàn)各不相同。

模版方法模式中的方法

模板方法中的方法可以分為兩大類:模板方法和基本方法。

1.模板方法

一個模板方法是定義在抽象類中的,把基本操作方法組合在一起形成一個總算法或一個總行為的方法。
  一個抽象類可以有任意多個模板方法,而不限于一個。每一個模板方法都可以調(diào)用任意多個具體方法。

2.基本方法

基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。

  • 抽象方法:一個抽象方法由抽象類聲明,由具體子類實(shí)現(xiàn)。在Java語言里抽象方法以abstract關(guān)鍵字標(biāo)示。
  • 具體方法:一個具體方法由抽象類聲明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或置換。
  • 鉤子方法:一個鉤子方法由抽象類聲明并實(shí)現(xiàn),而子類會加以擴(kuò)展。通常抽象類給出的實(shí)現(xiàn)是一個空實(shí)現(xiàn),作為方法的默認(rèn)實(shí)現(xiàn)。

3.默認(rèn)鉤子方法

一個鉤子方法常常由抽象類給出一個空實(shí)現(xiàn)作為此方法的默認(rèn)實(shí)現(xiàn)。這種空的鉤子方法叫做“Do Nothing Hook”。顯然,這種默認(rèn)鉤子方法在缺省適配模式里面已經(jīng)見過了,一個缺省適配模式講的是一個類為一個接口提供一個默認(rèn)的空實(shí)現(xiàn),從而使得缺省適配類的子類不必像實(shí)現(xiàn)接口那樣必須給出所有方法的實(shí)現(xiàn),因?yàn)橥ǔR粋€具體類并不需要所有的方法。

4.命名規(guī)則

命名規(guī)則是設(shè)計師之間賴以溝通的管道之一,使用恰當(dāng)?shù)拿?guī)則可以幫助不同設(shè)計師之間的溝通。
  鉤子方法的名字應(yīng)當(dāng)以do開始,這是熟悉設(shè)計模式的Java開發(fā)人員的標(biāo)準(zhǔn)做法。在上面的例子中,鉤子方法hookMethod()應(yīng)當(dāng)以do開頭;在HttpServlet類中,也遵從這一命名規(guī)則,如doGet()、doPost()等方法。

源碼

/**
 * 抽象模版
 */
public abstract class AbstractTemplate {

    /**
     * 模版方法
     */
    public final void templateMethod(){
        //調(diào)用基本方法
        abstractMethod();
        hookMethod();
        concreteMethod();
    }

    /**
     * 抽象方法 一個抽象方法由抽象類聲明,由具體子類實(shí)現(xiàn)。在Java語言里抽象方法以abstract關(guān)鍵字標(biāo)示。
     */
    protected abstract void abstractMethod();

    /**
     * 鉤子方法 一個鉤子方法由抽象類聲明并實(shí)現(xiàn),而子類會加以擴(kuò)展。通常抽象類給出的實(shí)現(xiàn)是一個空實(shí)現(xiàn),作為方法的默認(rèn)實(shí)現(xiàn)。
     */
    protected void hookMethod(){

    }

    /**
     * 具體方法 一個具體方法由抽象類聲明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或置換。
     */
    protected final void concreteMethod(){
        System.out.println("this is a concreteMethod");
    }
}
/**
 * 具體模版
 */
public class ConcreteTemplate1 extends AbstractTemplate {
    @Override
    protected void abstractMethod() {
        System.out.println("doing test1");
    }

    @Override
    protected void hookMethod() {
        System.out.println("hook 1");
    }
}
/**
 * 客戶端
 */
public class Client {

    public static void main(String[] args) {
        AbstractTemplate template1 = new ConcreteTemplate1();
        template1.templateMethod();

        AbstractTemplate template2 = new ConcreteTemplate2();
        template2.templateMethod();
    }

}

模板方法模式在Servlet中的應(yīng)用

使用過Servlet的人都清楚,除了要在web.xml做相應(yīng)的配置外,還需繼承一個叫HttpServlet的抽象類。HttpService類提供了一個service()方法,這個方法調(diào)用七個do方法中的一個或幾個,完成對客戶端調(diào)用的響應(yīng)。這些do方法需要由HttpServlet的具體子類提供,因此這是典型的模板方法模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,075評論 1 15
  • 本篇文章介紹一種設(shè)計模式——外觀模式。本篇文章內(nèi)容參考:《JAVA與模式》之模板方法模式,模板方法模式深度解析(三...
    Ruheng閱讀 1,079評論 0 6
  • 1 場景問題# 1.1 登錄控制## 幾乎所有的應(yīng)用系統(tǒng),都需要系統(tǒng)登錄控制的功能,有些系統(tǒng)甚至有多個登錄控制的功...
    七寸知架構(gòu)閱讀 2,042評論 3 53
  • 定義 模板方法模式是類的行為模式。準(zhǔn)備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后聲明一些抽象...
    步積閱讀 970評論 0 0
  • 先看圖,我想說的在后面 突然感覺有點(diǎn)對不起我這龜,給我當(dāng)兄弟也是苦了你了$笑哭$$笑哭$,等有錢了給你好好捯飭捯飭...
    猶克地里曼閱讀 359評論 0 0

友情鏈接更多精彩內(nèi)容