中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java模板方法模式是什么

發布時間:2021-11-15 16:18:43 來源:億速云 閱讀:146 作者:iii 欄目:大數據

本篇內容主要講解“Java模板方法模式是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“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):定義一個操作中的算法的框架,而將一些步驟延遲到子類中。模板方法允許子類在不改變算法結構的情況下重新定義算法的某些步驟。模板方法模式屬于行為型模式,主要使用Java的繼承機制來實現。

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

模板方法模式的兩個角色

  • AbstractClass(抽象類):定義了一系列基本操作(PrimitiveOperations),這些基本操作(方法)可以是具體的,也可以是抽象的,每一個基本操作對應算法的一個步驟,在其子類中可以重定義或實現這些步驟。同時,在抽象類中定義了一個模板方法(Template Method),也就是定義了一個算法的框架,并定義組合好了這些操作的執行順序。

     

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


 

模板方法模式UML圖

Java模板方法模式是什么

模板方法模式代碼演示

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

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("關閉社交軟件");    }    /**     * <p class="detail">     * 功能: 模板方法,模板方法,為了防止惡意的操作,一般模板方法都加上final關鍵字,子類不可實現     * </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("評論是:肖華應該懲罰莫雷!");    }}

3、客戶端調用

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

查看運行結果:

Java模板方法模式是什么

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

鉤子方法

為什么把這個單獨拿出來說,是因為在模板方法中有些方法是否執行是可選的,也就是不是所有模板中的算法都需要被執行,可以由子類來決定,這就是我們要說的“鉤子方法”。

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

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

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("關閉社交軟件");    }    /**     * <p class="detail">     * 功能: 模板方法,為了防止惡意的操作,一般模板方法都加上final關鍵字,子類不可實現     * </p>     *     * @author Moore     * @date 2019.10.16 11:53:02     */    public final void temtemplateMethod(){        openSocialSoftware();        if(isLogin()){            comment();        }else {            System.out.println("您未登錄,不可以發表評論哦,只能看別人罵莫雷");        }        closeSocialSoftware();    }    /**     * 鉤子方法:可以是抽象方法,空實現或默認實現,子類可以覆寫來決定模板方法是否執行某些算法     * @return     */    protected boolean isLogin(){        System.out.println("登錄后才可以評論---");        return true;    }}

2、編寫一個覆蓋鉤子方法的子類

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、客戶端調用

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、查看運行結果:

Java模板方法模式是什么

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

到此,相信大家對“Java模板方法模式是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兰考县| 邓州市| 平舆县| 延吉市| 兴化市| 墨玉县| 扬中市| 龙海市| 咸阳市| 刚察县| 昌吉市| 深州市| 吉木萨尔县| 文水县| 甘洛县| 涡阳县| 东光县| 桐梓县| 北票市| 平邑县| 华池县| 肥乡县| 淮南市| 剑阁县| 徐闻县| 临沧市| 梅州市| 绵竹市| 澄迈县| 齐齐哈尔市| 海口市| 上思县| 大田县| 静安区| 乌鲁木齐市| 五峰| 正安县| 即墨市| 衡水市| 瑞丽市| 镇江市|