(二)模板設(shè)計(jì)模式

1.概念

1.1.是什么砚哗?

在模板模式(Template Pattern)中龙助,一個抽象類公開定義了執(zhí)行它的方法的方式/模板。它的實(shí)現(xiàn)類按需要重寫方法實(shí)現(xiàn)蛛芥,但調(diào)用的控制邏輯由抽象類控制提鸟。

1.2.設(shè)計(jì)結(jié)構(gòu)

模板設(shè)計(jì)模式結(jié)構(gòu)

①. 模板模式主要由抽象模板(Abstract Template)角色和具體模板(Concrete Template)角色組成。

  • 抽象模板:定義一些抽象操作仅淑,并且規(guī)定這些抽象操作的執(zhí)行邏輯称勋。
  • 具體模板:重定義這些抽象操作以提供具體的行為,不能修改整個模板的執(zhí)行邏輯涯竟,可以實(shí)現(xiàn)豐富的方法操作赡鲜。

②. 模板方法是一種代碼復(fù)用的基本技術(shù)。它們在類庫中尤為重要庐船,它們提取了類庫中的公共行為银酬。模板方法導(dǎo)致一種反向的控制結(jié)構(gòu),這種結(jié)構(gòu)有時被稱為“好萊塢法則”筐钟,即“別找我們揩瞪,我們找你”。這指的是一個父類調(diào)用一個子類的操作篓冲。

  • 在模版方法中定義了整個模板的骨架李破,同時還有公有的具體的操作宠哄,另外還應(yīng)該具備必須實(shí)現(xiàn)的抽象操作和可實(shí)現(xiàn)的抽象操作(鉤子操作)
  • 鉤子操作,即一些非必需的省缺操作喷屋,通過子類實(shí)現(xiàn)是否需要該操作琳拨,對抽象類的控制邏輯產(chǎn)生影響瞭恰。該鉤子在抽象類中定義屯曹,因此父類默認(rèn)控制邏輯中可以不需要該操作。簡單來說惊畏,抽象類通過if判斷是否執(zhí)行某一個方法恶耽,而該判斷權(quán)交給子類根據(jù)場景來個性化實(shí)現(xiàn)。

2.應(yīng)用

  • 當(dāng)多個相似事物在操作上步驟多數(shù)相同的情況下颜启,將相同操作提為公有模塊偷俭,而不同部分提為抽象操作,而使用重寫來實(shí)現(xiàn)各自的邏輯缰盏。

3.案例

3.1.標(biāo)準(zhǔn)的模板設(shè)計(jì)模式

①. Abstract Template

  public abstract class TemplateDesignPatterns2 {

    /**
     * 模板方法執(zhí)行邏輯涌萤,要用final關(guān)鍵字進(jìn)行修飾,只可重寫不可修改
     */
    public final void coreLogicMethod() {
        System.out.println("執(zhí)行邏輯:");
        commonStart();
        uniqueStep();
        if (isHasCommonEnd()) {
            commonEnd();
        }
    }

    /**
     * 公共方法口猜,邏輯一定執(zhí)行
     */
    private void commonStart() {
        System.out.println("1.調(diào)用commonStart...");
    }

    /**
     * 子類必須重新實(shí)現(xiàn)方法负溪,邏輯一定執(zhí)行
     */
    protected abstract void uniqueStep();

    /**
     * 子類非必須重新實(shí)現(xiàn)方法,由子類根據(jù)場景重寫鉤子方法實(shí)現(xiàn)
     */
    protected void commonEnd() {
        System.out.println("3.調(diào)用commonEnd...");
    }

    /**
     * 鉤子方法济炎,控制commonEnd是否需要執(zhí)行,默認(rèn)執(zhí)行
     */
    protected boolean isHasCommonEnd() {
        return true;
    }
}

②. Concrete Template

public class TemplateDesignPatterns2Impl extends TemplateDesignPatterns2{

    @Override
    protected void uniqueStep() {
        System.out.println("2.調(diào)用子類重寫uniqueStep...");
    }

    @Override
    protected boolean isHasCommonEnd() {
        return false;
    }

    public static void main(String[] args) {
        TemplateDesignPatterns2 designPatterns2 = new TemplateDesignPatterns2Impl();
        designPatterns2.coreLogicMethod();
    }
}
  • 若子類根據(jù)業(yè)務(wù)場景川抡,commonEnd()方法需要實(shí)現(xiàn),則直接重寫該方法须尚,若該方法不需要崖堤,如上圖控制鉤子去掉。

3.2.對上述代碼變相(類似thread中的調(diào)用方式)

public abstract class TemplateDesignPatterns {

    /**
     * 模板方法耐床, 要用final關(guān)鍵字進(jìn)行修飾密幔,只可重寫不可修改
     *
     * @return
     */
    public TemplateDesignPatterns start() {
        System.out.println("執(zhí)行邏輯:");
        commonStep();
        uniqueStep();
        return null;
    }

    private void commonStep() {
        System.out.println("1.公用方法...調(diào)用commonStep");
    }

    protected abstract void uniqueStep();

    public static void main(String[] args) {
        //隱式實(shí)現(xiàn)該方法
        TemplateDesignPatterns designPattern = new TemplateDesignPatterns() {
            @Override
            protected void uniqueStep() {
                System.out.println("2.個性實(shí)現(xiàn)私有邏輯...調(diào)用uniqueStep");
            }
        };
        designPattern.start();
    }
}
  • 由于筆者閱讀書中介紹:Thread的run和 start為一個典型的模板設(shè)計(jì)模式,但由于JNI調(diào)用具體過程無法得知撩轰,故此寫了一個認(rèn)為的類似實(shí)現(xiàn)胯甩,若有錯誤請多多賜教。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钧敞,一起剝皮案震驚了整個濱河市蜡豹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溉苛,老刑警劉巖镜廉,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異愚战,居然都是意外死亡娇唯,警方通過查閱死者的電腦和手機(jī)齐遵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塔插,“玉大人梗摇,你說我怎么就攤上這事∠胄恚” “怎么了伶授?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長流纹。 經(jīng)常有香客問我糜烹,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮厢漩,結(jié)果婚禮上兵睛,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著感论,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贮尖。 梳的紋絲不亂的頭發(fā)上笛粘,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音湿硝,去河邊找鬼薪前。 笑死,一個胖子當(dāng)著我的面吹牛关斜,可吹牛的內(nèi)容都是我干的示括。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼痢畜,長吁一口氣:“原來是場噩夢啊……” “哼垛膝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丁稀,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤吼拥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后线衫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凿可,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年授账,在試婚紗的時候發(fā)現(xiàn)自己被綠了枯跑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惨驶。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敛助,靈堂內(nèi)的尸體忽然破棺而出粗卜,到底是詐尸還是另有隱情,我是刑警寧澤纳击,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布续扔,位于F島的核電站,受9級特大地震影響评疗,放射性物質(zhì)發(fā)生泄漏测砂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一百匆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呜投,春花似錦加匈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粘招,卻和暖如春啥寇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洒扎。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工辑甜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袍冷。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓磷醋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胡诗。 傳聞我的和親對象是個殘疾皇子邓线,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容