溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java模板方法模式是什么

發(fā)布時(shí)間:2021-11-15 16:18:43 來(lái)源:億速云 閱讀:138 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Java模板方法模式是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java模板方法模式是什么”吧!

什么是模板方法模式

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.

Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's  structure.

模板方法模式(Template Method Pattern):定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類中。模板方法允許子類在不改變算法結(jié)構(gòu)的情況下重新定義算法的某些步驟。模板方法模式屬于行為型模式,主要使用Java的繼承機(jī)制來(lái)實(shí)現(xiàn)。

模板方法,顧名思義就是一個(gè)模板,按照模板做事,模板方法里封裝了方法的執(zhí)行步驟,調(diào)用方只需要通過(guò)調(diào)用模板就能按照正確的順序把事情做好。

模板方法模式的兩個(gè)角色

  • AbstractClass(抽象類):定義了一系列基本操作(PrimitiveOperations),這些基本操作(方法)可以是具體的,也可以是抽象的,每一個(gè)基本操作對(duì)應(yīng)算法的一個(gè)步驟,在其子類中可以重定義或?qū)崿F(xiàn)這些步驟。同時(shí),在抽象類中定義了一個(gè)模板方法(Template Method),也就是定義了一個(gè)算法的框架,并定義組合好了這些操作的執(zhí)行順序。

     

  • ConcreteClass(具體子類):抽象類的子類,用于實(shí)現(xiàn)在父類中聲明的抽象基本操作以完成子類特定算法的步驟,也可以覆蓋在父類中已經(jīng)實(shí)現(xiàn)的具體基本操作。


 

模板方法模式UML圖

Java模板方法模式是什么

模板方法模式代碼演示

有小伙伴要問(wèn)了,模板方法模式和莫雷事件有什么關(guān)系嗎?他們二者之間本身并沒(méi)有任何關(guān)聯(lián),我是在觀察大家在面對(duì)這件事的態(tài)度,以及我們表達(dá)我們觀點(diǎn)所采用的方式。再抽象一下,我們每個(gè)人對(duì)這件事的行為是不是可以簡(jiǎn)單的抽象成,打開(kāi)社交軟件,發(fā)表觀點(diǎn)和意見(jiàn)、關(guān)閉社交軟件。這是什么?運(yùn)用到項(xiàng)目上來(lái)看,這不就是一個(gè)模板方法嗎?大家都是按照這個(gè)模板在表達(dá)觀點(diǎn),不同的是有的人用的微博,有的人用的虎撲,有的用的推特,有的支持莫雷,有的罵莫雷等等。我們來(lái)看一下代碼實(shí)現(xiàn)。

1、編寫(xiě)抽象模板類

package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 抽象模板類 * </p> * * @author Moore * @ClassName Comment. * @Version V1.0. * @date 2019.10.16 11:53:02 */public abstract class Comment {    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    protected abstract void openSocialSoftware();    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    protected abstract void comment();    /**     * <p class="detail">     * 功能: 具體方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    protected void closeSocialSoftware(){        System.out.println("關(guān)閉社交軟件");    }    /**     * <p class="detail">     * 功能: 模板方法,模板方法,為了防止惡意的操作,一般模板方法都加上final關(guān)鍵字,子類不可實(shí)現(xiàn)     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    public final void temtemplateMethod(){        openSocialSoftware();        comment();        closeSocialSoftware();    }}

2、編寫(xiě)具體類

package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 具體類 * </p> * * @author Moore * @ClassName Zhang san. * @Version V1.0. * @date 2019.10.16 14:00:09 */public class ZhangSan extends Comment {    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void openSocialSoftware() {        System.out.println("打開(kāi)微博!");    }    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void comment() {        System.out.println("評(píng)論是:莫雷必須道歉,肖華必須道歉!解雇莫雷!");    }}
package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 具體類 * </p> * * @author Moore * @ClassName Li si. * @Version V1.0. * @date 2019.10.16 13:59:56 */public class LiSi extends Comment {    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void openSocialSoftware() {        System.out.println("打開(kāi)虎撲");    }    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void comment() {        System.out.println("評(píng)論是:莫雷是傻X,WQNMLGB");    }}
package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 具體類 * </p> * * @author Moore * @ClassName James. * @Version V1.0. * @date 2019.10.16 13:59:01 */public class James extends Comment {    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void openSocialSoftware() {        System.out.println("打開(kāi)推特");    }    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void comment() {        System.out.println("評(píng)論是:肖華應(yīng)該懲罰莫雷!");    }}

3、客戶端調(diào)用

package com.mazhichu.designpatterns.templatemethod;public class Client {    public static void main(String[] args) {        Comment zhangSan = new ZhangSan();        zhangSan.temtemplateMethod();        System.out.println("-----------------\n");        Comment lisi = new LiSi();        lisi.temtemplateMethod();        System.out.println("-----------------\n");        Comment james = new James();        james.temtemplateMethod();    }}

查看運(yùn)行結(jié)果:

Java模板方法模式是什么

上面就是模板方法模式,可能是最常見(jiàn)也是最簡(jiǎn)單的設(shè)計(jì)模式了,父類(抽象類)定義算法和模板方法,模板方法約定好算法執(zhí)行順序,子類只需要實(shí)現(xiàn)父類的抽象算法,就能按照模板方法既定的順序執(zhí)行得到不同的結(jié)果,這樣做大大簡(jiǎn)化了子類的復(fù)雜度。

鉤子方法

為什么把這個(gè)單獨(dú)拿出來(lái)說(shuō),是因?yàn)樵谀0宸椒ㄖ杏行┓椒ㄊ欠駡?zhí)行是可選的,也就是不是所有模板中的算法都需要被執(zhí)行,可以由子類來(lái)決定,這就是我們要說(shuō)的“鉤子方法”。

鉤子方法是一種被聲明在抽象類中的方法,一般是空實(shí)現(xiàn)或者有默認(rèn)值,子類可以實(shí)現(xiàn)覆蓋該鉤子,來(lái)決定算法步驟的某一步驟是否要執(zhí)行,這是一種反向控制。

我們來(lái)改造一下抽象類,加入鉤子方法。

1、重新抽象類,加入鉤子方法

package com.mazhichu.designpatterns.templatemethod;/** * <p class="detail"> * 功能: 抽象模板類 * </p> * * @author Moore * @ClassName Comment. * @Version V1.0. * @date 2019.10.16 11:53:02 */public abstract class Comment {    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    protected abstract void openSocialSoftware();    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    protected abstract void comment();    /**     * <p class="detail">     * 功能: 具體方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    protected void closeSocialSoftware(){        System.out.println("關(guān)閉社交軟件");    }    /**     * <p class="detail">     * 功能: 模板方法,為了防止惡意的操作,一般模板方法都加上final關(guān)鍵字,子類不可實(shí)現(xiàn)     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    public final void temtemplateMethod(){        openSocialSoftware();        if(isLogin()){            comment();        }else {            System.out.println("您未登錄,不可以發(fā)表評(píng)論哦,只能看別人罵莫雷");        }        closeSocialSoftware();    }    /**     * 鉤子方法:可以是抽象方法,空實(shí)現(xiàn)或默認(rèn)實(shí)現(xiàn),子類可以覆寫(xiě)來(lái)決定模板方法是否執(zhí)行某些算法     * @return     */    protected boolean isLogin(){        System.out.println("登錄后才可以評(píng)論---");        return true;    }}

2、編寫(xiě)一個(gè)覆蓋鉤子方法的子類

package com.mazhichu.designpatterns.templatemethod;public class LaoBao extends Comment {    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void openSocialSoftware() {        System.out.println("打開(kāi)知乎");    }    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void comment() {        System.out.println("我不但想罵莫雷肖華,還想問(wèn)候川普");    }    @Override    protected boolean isLogin() {        return false;    }}

3、客戶端調(diào)用

package com.mazhichu.designpatterns.templatemethod;public class Client {    public static void main(String[] args) {        Comment zhangSan = new ZhangSan();        zhangSan.temtemplateMethod();        System.out.println("-----------------\n");        Comment lisi = new LiSi();        lisi.temtemplateMethod();        System.out.println("-----------------\n");        Comment james = new James();        james.temtemplateMethod();        System.out.println("-----------------\n");        Comment laobao = new LaoBao();        laobao.temtemplateMethod();    }}

4、查看運(yùn)行結(jié)果:

Java模板方法模式是什么

通過(guò)結(jié)果可以得出,加入鉤子方法后,可以反向控制父類中的模板方法中某些算法是否要被執(zhí)行,這樣也增加了模板方法的靈活性。

到此,相信大家對(duì)“Java模板方法模式是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI