Java 模板模式

一、定義

定義一個(gè)操作中的算法骨架搓蚪,而將算法的一些步驟延遲到子類中像寒,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。它是一種類行為型模式誓焦。

主要角色:

抽象類:負(fù)責(zé)給出一個(gè)算法的輪廓或骨架羔巢,它由一個(gè)模板方法和若干個(gè)基本方法構(gòu)成。

  1. 模板方法:定義了算法的骨架,按某種順序調(diào)用其包含的基本方法竿秆。
  2. 具體方法:是實(shí)現(xiàn)算法各個(gè)步驟的方法启摄,是模板方法的組成部分,基本方法又分為三種:
    1. 抽象方法:一個(gè)抽象方法由抽象類聲明幽钢,由具體子類實(shí)現(xiàn)
    2. 具體方法:一個(gè)具體方法由一個(gè)抽象類或具體類聲明并實(shí)現(xiàn)歉备,其子類可以進(jìn)行覆蓋也可以直接繼承。
    3. 鉤子方法:在抽象類中已經(jīng)實(shí)現(xiàn)匪燕,包括用于判斷的邏輯方法和需要子類重寫的空方法兩種蕾羊。

具體子類:實(shí)現(xiàn)抽象類中所定義的抽象方法和鉤子方法,它們是一個(gè)頂級邏輯的組成步驟帽驯。

二龟再、代碼實(shí)現(xiàn)

舉例:例如去銀行辦理業(yè)務(wù),需要取號尼变,排隊(duì)利凑,辦理具體業(yè)務(wù),對工作人員評分嫌术,其中取號哀澈,排隊(duì),評分三個(gè)步驟不論是誰都是一樣的度气,但是辦理具體業(yè)務(wù)卻因人而異割按,可能是存款,可能是取款磷籍,可以延遲到子類中實(shí)現(xiàn)适荣。

抽象類:

public abstract class AbstractClass {
    //模板方法
    public void start(){
        getNumber();
        lineUp();
        doSomething();
        appraise();
    }

    //基本方法
    public void getNumber(){
        System.out.println("銀行取號");
    }

    public void lineUp(){
        System.out.println("銀行排隊(duì)");
    }

    public void appraise(){
        System.out.println("銀行評價(jià)");
    }

    //抽象方法
    public abstract void doSomething();
}

具體子類:辦理存款業(yè)務(wù)

public class Deposit extends AbstractClass {
    @Override
    public void doSomething() {
        System.out.println("辦理存款業(yè)務(wù)");
    }
}

使用:

public static void main(String[] args) {
        Deposit deposit = new Deposit();
        deposit.start();
    }

輸出:

銀行取號
銀行排隊(duì)
辦理存款業(yè)務(wù)
銀行評價(jià)

如果此時(shí)想要辦理取款業(yè)務(wù)怎么辦?那么只需要增加一個(gè)子類來完成具體的取款業(yè)務(wù):

具體子類:辦理取款業(yè)務(wù)

public class Withdraw extends AbstractClass {
    @Override
    public void doSomething() {
        System.out.println("辦理取款業(yè)務(wù)");
    }
}


三院领、總結(jié)

優(yōu)點(diǎn):提高代碼的復(fù)用性弛矛,將相同部分放在抽象的父類中,不同的代碼放入不同的子類中栅盲。

缺點(diǎn):對于每一個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類汪诉,導(dǎo)致類的數(shù)量增加。

場景:算法的整體步驟很固定谈秫,但其中個(gè)別部分易變時(shí)扒寄,這時(shí)候可以使用模板方法模式,將容易變的部分抽象出來拟烫,由子類實(shí)現(xiàn)该编。或需要通過子類來決定父類算法中某個(gè)步驟是否執(zhí)行硕淑,實(shí)現(xiàn)子類對父類的反向控制课竣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘉赎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子于樟,更是在濱河造成了極大的恐慌公条,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迂曲,死亡現(xiàn)場離奇詭異靶橱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)路捧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門关霸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杰扫,你說我怎么就攤上這事队寇。” “怎么了章姓?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵佳遣,是天一觀的道長。 經(jīng)常有香客問我啤覆,道長苍日,這世上最難降的妖魔是什么惭聂? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任窗声,我火速辦了婚禮,結(jié)果婚禮上辜纲,老公的妹妹穿的比我還像新娘笨觅。我一直安慰自己,他們只是感情好耕腾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布见剩。 她就那樣靜靜地躺著,像睡著了一般扫俺。 火紅的嫁衣襯著肌膚如雪苍苞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天狼纬,我揣著相機(jī)與錄音羹呵,去河邊找鬼。 笑死疗琉,一個(gè)胖子當(dāng)著我的面吹牛冈欢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盈简,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凑耻,長吁一口氣:“原來是場噩夢啊……” “哼太示!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起香浩,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤类缤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后邻吭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呀非,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年镜盯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岸裙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡速缆,死狀恐怖降允,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艺糜,我是刑警寧澤剧董,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站破停,受9級特大地震影響翅楼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜真慢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一毅臊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黑界,春花似錦管嬉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烛占,卻和暖如春胎挎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忆家。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工犹菇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弦赖。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓项栏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹬竖。 傳聞我的和親對象是個(gè)殘疾皇子沼沈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

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

  • 1.概念 定義一個(gè)操作中算法的骨架流酬,而將一些步驟延遲到子類中,模板方法使得子類可以不改變算法的結(jié)構(gòu)即可重定義該算法...
    小石頭呢閱讀 136評論 0 0
  • Java模板模式 在模板模式中列另,抽象類公開了定義的方法/模板來執(zhí)行它的方法芽腾。 它的子類可以根據(jù)需要重寫方法實(shí)現(xiàn),但...
    木易林1閱讀 2,750評論 0 0
  • 在面向?qū)ο蟪绦蛟O(shè)計(jì)過程中页衙,程序員常常會遇到這種情況:設(shè)計(jì)一個(gè)系統(tǒng)時(shí)知道了算法所需的關(guān)鍵步驟摊滔,而且確定了這些步驟的執(zhí)...
    迷心迷閱讀 153評論 0 0
  • 在面向?qū)ο蟪绦蛟O(shè)計(jì)過程中,程序員常常會遇到這種情況:設(shè)計(jì)一個(gè)系統(tǒng)時(shí)知道了算法所需的關(guān)鍵步驟店乐,而且確定了這些步驟的執(zhí)...
    Zal哥哥閱讀 467評論 0 0
  • 在面向?qū)ο蟪绦蛟O(shè)計(jì)過程中艰躺,程序員常常會遇到這種情況:設(shè)計(jì)一個(gè)系統(tǒng)時(shí)知道了算法所需的關(guān)鍵步驟,而且確定了這些步驟的執(zhí)...
    木子教程閱讀 176評論 0 1