模板方法

1、定義前端

定義了一個算法的骨架,並容許子類爲一個或多個步驟提供實現java

模板方法使子類能夠在不改變算法結構的狀況下,從新定義算法的某些步驟算法

類型:行爲型後端

 

2、適用場景設計模式

一次性實現一個算法的不變部分,並將可變的行爲留給子類來實現ide

各子類中公共的行爲被提取出來並集中到一個公共父類中,從而避免代碼重複測試

 

3、優勢this

一、提升複用性設計

二、提升擴展性視頻

三、符合開閉原則

 

4、缺點

一、類數目增長

二、增長了系統實現的複雜度

三、繼承關係自身缺點,若是父類添加新的抽象方法,全部子類都要改一遍

 

5、模板方法-擴展

一、鉤子方法

 

6、模板方法-相關設計模式

一、模板方法模式和工廠方法模式

工廠方法是模板方法的一種特殊實現。

 

二、模板方法模式和策略模式

 策略模式:使不一樣的算法能夠相互替換,並不影響客戶處應用端的使用。能夠改變算法的流程。若是代碼中有大量的If-Else,能夠考慮策略模式。

 模板方法:針對定義一個算法的流程,將一些不太同樣具體實現步驟交給子類實現。模板方法不改變算法的流程。

 

7、Coding

一、ACourse抽象類

public abstract class ACourse {
    protected  final void makeCourse(){
        this.makePPT();
        this.makeVideo();
        if(needWrite()){
            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 needWrite(){
        return false;
    }

    abstract void packageCourse();

}

 

二、 DesignPatternCourse類

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

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


}

  

三、FECourse類

/**
 * 前端課程
 */
public class FECourse extends ACourse {
    @Override
    void packageCourse() {
        System.out.println("提供課程前端源代碼");
        System.out.println("提供課程圖片等多媒體素材");
    }
}

  

四、測試

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


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

  

五、輸出結果

後端設計模式課程start---
製做PPT
製做視頻
編寫手記
提供課程Java源代碼
後端設計模式課程end---
前端設計模式課程start---
製做PPT
製做視頻
提供課程前端源代碼
提供課程圖片等多媒體素材
前端設計模式課程end---

  

六、UML圖

 

四、前端課程 控制needWrite

/**
 * 前端課程
 */
public class FECourse extends ACourse {

    private boolean needWriteArticleFlag = false;

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

    public void setNeedWriteArticleFlag(boolean needWriteArticleFlag) {
        this.needWriteArticleFlag = needWriteArticleFlag;
    }

    @Override
    protected boolean needWrite() {
        return  needWriteArticleFlag;
    }
}
相關文章
相關標籤/搜索