模板方法模式

1、模板方法模式介紹

一、定義與類型

定義:定義了一個算法的骨架,並容許子類爲一個或多個步驟提供實現
模板方法使得子類能夠在不改變算法結構的狀況下,從新定義算法的某些步驟
類型:行爲型前端

二、適用場景

一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現
各子類中公共的行爲被提取出來並集中到一個公共父類中,從而避免代碼重複算法

三、優勢

提升複用性
提升擴展性
符合開閉原則後端

四、缺點

類數目增長
增長了系統實現的複雜度
繼承關係自身缺點,若是父類添加新的抽象方法,全部子類都要改一遍設計模式

五、擴展

鉤子方法tomcat

六、相關設計模式

模板方法模式和工廠方法模式ide

模板方法模式和策略模式
策略模式是使不一樣的算法能夠相互替換,而且不影響應用層客戶端的使用,能夠改變算法的流程;而模板方法模式是針對頂一個算法的流程,將一些不太同樣的步驟交給子類去實現,不改變算法的流程測試

2、代碼示例

模擬場景:製做課程,有些步驟和操做是固定的,但打包的時候每一個課程都有本身的打包方式,而且課程不必定有手記this

課程抽象類:設計

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();
}

課程實現類1:code

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

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

課程實現類2:

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;
    }
}

測試類:

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(false);
        feCourse.makeCourse();
        System.out.println("前端課程end---");
    }
}

3、源碼示例

一、JDK中的AbstractList

AbstractSet、AbstractMap同理

二、tomcat中的HttpServlet


相關文章
相關標籤/搜索