設(shè)計模式之——模版模式

模板模式通常又叫模板方法模式(Template Method Pattern)是指定義一個算法的骨架飘蚯,并允許子類為一個或者多個步驟提供實現(xiàn)堡赔。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下漾稀,重新定義算法的某些步驟芝加,屬于行為型設(shè)計模式耍攘。

適用場景:
1武通、一次性實現(xiàn)一個算法的不變的部分奉呛,并將可變的行為留給子類來實現(xiàn)计螺。
2、各子類中公共的行為被提取出來并集中到一個公共的父類中瞧壮,從而避免代碼重復(fù)登馒。

簡單來說:就是提取出共通或者共性的一部分內(nèi)容作為父類,然后讓每一個子類去實現(xiàn)共性的邏輯咆槽,同時子類可以添加自己的邏輯

代碼實現(xiàn)

/**
* 模板會有一個或者多個未現(xiàn)實方法陈轿,
* 而且這幾個未實現(xiàn)方法有固定的執(zhí)行循序
* 抽象出公共的模塊
*/
public abstract class NetworkCourse {
    protected final void createCourse(){
        //1、發(fā)布預(yù)習(xí)資料
        this.postPreResource();
        //2秦忿、制作 PPT 課件
        this.createPPT();
        //3麦射、在線直播
        this.liveVideo();
        //4、提交課件灯谣、課堂筆記
        this.postNote();
        //5潜秋、提交源碼
        this.postSource();
        //6、布置作業(yè)胎许,有些課是沒有作業(yè)峻呛,有些課是有作業(yè)的
        //如果有作業(yè)的話,檢查作業(yè)辜窑,如果沒作業(yè)钩述,完成了
        if(needHomework()){
            checkHomework();
        }
    }

    abstract void checkHomework();

    //鉤子方法:實現(xiàn)流程的微調(diào),判斷是否有作業(yè)
    /**
      * 鉤子函數(shù)的目的:用來干預(yù)執(zhí)行流程谬擦,使得我們控制行為流程                          
      * 更加靈活切距,更符合實際業(yè)務(wù)的需求朽缎,鉤子函數(shù)的返回值一般
      * 比較明顯的判斷惨远,例如boolean、int
      */
    protected boolean needHomework(){return false;}
    
    final void postPreResource(){
        System.out.println("分發(fā)預(yù)習(xí)資料");
    }

    final void createPPT(){
        System.out.println("創(chuàng)建備課 PPT");
    }

    final void liveVideo(){
        System.out.println("直播授課");
    }

    final void postNote(){
        System.out.println("提交課件和筆記");
    }

    final void postSource(){
        System.out.println("提交源代碼");
    }
}

子類實現(xiàn)流程

public class JavaCourse extends NetworkCourse {
    void checkHomework() {
        System.out.println("檢查 Java 的架構(gòu)課件");
    }
}

public class BigDataCourse extends NetworkCourse {
    private boolean needHomeworkFlag = false;
    public BigDataCourse(boolean needHomeworkFlag) {
        this.needHomeworkFlag = needHomeworkFlag;
    }

    void checkHomework() {
        System.out.println("檢查大數(shù)據(jù)的課后作業(yè)");
    }

    @Override
    protected boolean needHomework() {
        return this.needHomeworkFlag;
    }
}

測試

public class NetworkCourseTest {
    public static void main(String[] args) {
        System.out.println("---Java 架構(gòu)師課程---");
        NetworkCourse javaCourse = new JavaCourse();
        javaCourse.createCourse();
        //子類自己定義了一項 checkHomework

        System.out.println("---大數(shù)據(jù)課程---");
        NetworkCourse bigDataCourse = new BigDataCourse(true);
        bigDataCourse.createCourse();
    }
}

優(yōu)點

1话肖、利用模板方法將相同處理邏輯的代碼放到抽象父類中北秽,可以提高代碼的復(fù)用性
2最筒、將不同的代碼不同的子類中贺氓,通過對子類的擴展增加新的行為,提高代碼的擴展性床蜘。
3辙培、把不變的行為寫在父類上蔑水,去除子類的重復(fù)代碼,提供了一個很好的代碼復(fù)用平臺扬蕊,符合開閉原則搀别。

缺點:
1、類數(shù)目的增加尾抑,每一個抽象類都需要一個子類來實現(xiàn)歇父,這樣導(dǎo)致類的個數(shù)增加。
2再愈、類數(shù)量的增加榜苫,間接地增加了系統(tǒng)實現(xiàn)的復(fù)雜度。
3翎冲、繼承關(guān)系自身缺點垂睬,如果父類添加新的抽象方法,所有子類都要改一遍抗悍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羔飞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子檐春,更是在濱河造成了極大的恐慌逻淌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疟暖,死亡現(xiàn)場離奇詭異卡儒,居然都是意外死亡,警方通過查閱死者的電腦和手機俐巴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門骨望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欣舵,你說我怎么就攤上這事擎鸠。” “怎么了缘圈?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵劣光,是天一觀的道長。 經(jīng)常有香客問我糟把,道長绢涡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任遣疯,我火速辦了婚禮雄可,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己数苫,他們只是感情好聪舒,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虐急,像睡著了一般过椎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戏仓,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天疚宇,我揣著相機與錄音,去河邊找鬼赏殃。 笑死敷待,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仁热。 我是一名探鬼主播榜揖,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抗蠢!你這毒婦竟也來了举哟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迅矛,失蹤者是張志新(化名)和其女友劉穎妨猩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秽褒,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡壶硅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了销斟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庐椒。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚂踊,靈堂內(nèi)的尸體忽然破棺而出约谈,到底是詐尸還是另有隱情,我是刑警寧澤犁钟,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布棱诱,位于F島的核電站,受9級特大地震影響特纤,放射性物質(zhì)發(fā)生泄漏军俊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一捧存、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦昔穴、人聲如沸镰官。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泳唠。三九已至,卻和暖如春宙搬,著一層夾襖步出監(jiān)牢的瞬間笨腥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工勇垛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脖母,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓闲孤,卻偏偏與公主長得像谆级,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讼积,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • What: 定義一個操作中的算法骨架肥照,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該...
    愛打乒乓的程序員閱讀 928評論 0 0
  • 模板模式 編寫優(yōu)秀代碼的一個要素是避免冗余勤众。在面向?qū)ο缶幊讨杏咭铮椒ê秃瘮?shù)是我們用來避免編寫冗余代碼的重要工具∶茄眨回想...
    英武閱讀 1,328評論 0 50
  • 簡介 在模板模式(Template Pattern)中亿蒸,一個抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以...
    盜夢者_(dá)56f2閱讀 124評論 0 1
  • 前周在廣州中級財務(wù)人員的后續(xù)教育學(xué)習(xí)掌桩。和我同居的是一位50左右的主業(yè)會計边锁,人長得白凈,顯年輕波岛,只是眼睛特別浮腫茅坛。心...
    木木_00d1閱讀 342評論 0 0
  • #葉子姑娘自律100天挑戰(zhàn)day69# 【早起】早上5:01起床。 【運動】健走4公里 【新習(xí)慣】晚上10點以前睡...
    水潔甘清閱讀 166評論 0 0