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