定義:定義了一個算法的骨架,並容許子類爲一個或多個步驟提供實現
模板方法使得子類能夠在不改變算法結構的狀況下,從新定義算法的某些步驟
類型:行爲型前端
一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現
各子類中公共的行爲被提取出來並集中到一個公共父類中,從而避免代碼重複算法
提升複用性
提升擴展性
符合開閉原則後端
類數目增長
增長了系統實現的複雜度
繼承關係自身缺點,若是父類添加新的抽象方法,全部子類都要改一遍設計模式
鉤子方法tomcat
模板方法模式和工廠方法模式ide
模板方法模式和策略模式
策略模式是使不一樣的算法能夠相互替換,而且不影響應用層客戶端的使用,能夠改變算法的流程;而模板方法模式是針對頂一個算法的流程,將一些不太同樣的步驟交給子類去實現,不改變算法的流程測試
模擬場景:製做課程,有些步驟和操做是固定的,但打包的時候每一個課程都有本身的打包方式,而且課程不必定有手記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---"); } }
AbstractSet、AbstractMap同理