Java模板方法模式是什么

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

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出新吳免費(fèi)做網(wǎng)站回饋大家。

什么是模板方法模式

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ī)制來實(shí)現(xiàn)。

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

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

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

     

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


 

模板方法模式UML圖

Java模板方法模式是什么

模板方法模式代碼演示

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

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();        comment();        closeSocialSoftware();    }}

2、編寫具體類

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("打開微博!");    }    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void comment() {        System.out.println("評論是:莫雷必須道歉,肖華必須道歉!解雇莫雷!");    }}
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("打開虎撲");    }    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void comment() {        System.out.println("評論是:莫雷是傻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("打開推特");    }    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void comment() {        System.out.println("評論是:肖華應(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模板方法模式是什么

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

鉤子方法

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

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

我們來改造一下抽象類,加入鉤子方法。

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ā)表評論哦,只能看別人罵莫雷");        }        closeSocialSoftware();    }    /**     * 鉤子方法:可以是抽象方法,空實(shí)現(xiàn)或默認(rèn)實(shí)現(xiàn),子類可以覆寫來決定模板方法是否執(zhí)行某些算法     * @return     */    protected boolean isLogin(){        System.out.println("登錄后才可以評論---");        return true;    }}

2、編寫一個(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("打開知乎");    }    /**     * <p class="detail">     * 功能: 基本抽象方法     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    @Override    protected void comment() {        System.out.println("我不但想罵莫雷肖華,還想問候川普");    }    @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模板方法模式是什么

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

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

文章題目:Java模板方法模式是什么
當(dāng)前鏈接:http://muchs.cn/article20/jiosjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈用戶體驗(yàn)、品牌網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、定制開發(fā)、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)