Android設(shè)計(jì)模式(十四)-- 模板方法模式

源代碼
GitHub源代碼

1.本文目標(biāo)

本文目標(biāo)是為了讓大家認(rèn)識并理解模板方法模式

2.基本套路

定義:定義了一個算法的骨架,并允許子類為一個或多個步驟提供實(shí)現(xiàn)
類型:行為型
選擇關(guān)鍵點(diǎn):算法骨架是否牢固
設(shè)計(jì)原則:破壞里氏替換,體現(xiàn)功能復(fù)用
使用概率:80%
難度系數(shù):中低

3.適用場景

1.一次性實(shí)現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)
2.各子類中公共的行為被提取出來并集中到一個公共父類中,從而避免代碼重復(fù)

4.使用步驟

用栗子能更好的說明問題,請繼續(xù)往下看

5.舉個栗子

我們用具體的代碼去更好的理解這個設(shè)計(jì)模式

5.1栗子說明

  • 背景:錄制視頻都需要編寫ppt,制作視頻和寫手記,然后用這個模板制作不同的課程
  • 目的:通過模板方法去制作

5.2使用步驟

實(shí)現(xiàn)代碼如下:

步驟1.創(chuàng)建課程抽象類

public abstract class ACourse {

    //模板方法 制作課程
    protected final void makeCourse(){
        this.makePPT();
        this.makeVideo();
        if(needWriteArticle()){
            this.writeArticle();
        }
        this.packageCourse();
    }

    final void makePPT(){
        System.out.println("制作PPT");
    }
    final void makeVideo(){
        System.out.println("制作視頻");
    }
    final void writeArticle(){
        System.out.println("編寫手記");
    }
    //鉤子方法
    protected boolean needWriteArticle(){
        return false;
    }
    
    //包裝課程
    abstract void packageCourse();
}

步驟2.創(chuàng)建設(shè)計(jì)模式課程,繼承抽象課程類

public class DesignPatternCourse extends ACourse {
    @Override
    void packageCourse() {
        System.out.println("提供課程Java源代碼");
    }

    @Override
    protected boolean needWriteArticle() {
        return true;
    }
}

步驟3.創(chuàng)建前端課程,繼承抽象課程類

public class FECourse extends ACourse {

    private boolean needWriteArticleFlag = false;

    @Override
    void packageCourse() {
        System.out.println("提供課程的前端代碼");
        System.out.println("提供課程的圖片等多媒體素材");
    }

    public FECourse(boolean needWriteArticleFlag) {
        this.needWriteArticleFlag = needWriteArticleFlag;
    }

    @Override
    protected boolean needWriteArticle() {
        return this.needWriteArticleFlag;
    }
}

步驟4. 測試

 public static void main(String[] args) {
        System.out.println("設(shè)計(jì)模式課程start---");
        ACourse designPatternCourse = new DesignPatternCourse();
        designPatternCourse.makeCourse();
        System.out.println("設(shè)計(jì)模式課程end---");


        System.out.println("前端課程start---");
        ACourse feCourse = new FECourse(false);
        feCourse.makeCourse();
        System.out.println("前端課程end---");
 }

6.優(yōu)點(diǎn)

  • 提高復(fù)用性
  • 提高擴(kuò)展性
  • 符合開閉原則

7.缺點(diǎn)

  • 類數(shù)目的增加
  • 增加了系統(tǒng)實(shí)現(xiàn)的復(fù)雜度
  • 繼承關(guān)系自身缺點(diǎn),如果父類添加新的抽象方法,所有的子類都要改一遍

8.總結(jié)

本文只是對模板方法模式進(jìn)行一個分享,接下來會從創(chuàng)建型模式,結(jié)構(gòu)型模式,行為型模式,這三大類展開一個系列分享,大家可以持續(xù)進(jìn)行關(guān)注,信仰年輕的設(shè)計(jì)模式,蟹蟹啦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容