模板方法是一種行爲設計模式,它用於建立一個方法存根和推遲一些步驟執行的子類。模板方法定義的步驟來執行一個算法,它能夠提供一種多是共同的全部或一些子類的默認的實現。
讓咱們來了解這種模式有一個例子,假設咱們要提供一個算法來蓋房子。該步驟須要執行蓋房是 - 建築物地基,建築物的支柱,建築牆體和窗戶。最重要的一點是,咱們不能改變執行的順序,由於咱們不能創建在建地基前去建造窗戶。所以,在這種狀況下,咱們能夠建立將使用不一樣的方法來構建房子的模板方法。
如今全部類型的房子的地基都是是相同的,不管是它的一個木製的房子或是玻璃房子。所以,咱們能夠提供基本實現,若是子類須要重寫此方法,它們能夠從新實現內容,但大可能是很常見的房屋全部類型。java
模版方法抽象類:算法
因爲咱們想要子類實現該方法,因此咱們建立基類爲抽象類;windows
HouseTemplate.java設計模式
package com.journaldev.design.template; public abstract class HouseTemplate { //模版方法, final 拒絕子類重寫 public final void buildHouse(){ buildFoundation(); buildPillars(); buildWalls(); buildWindows(); System.out.println("House is built."); } //默認實現 private void buildWindows() { System.out.println("Building Glass Windows"); } //子類必須實現方法 public abstract void buildWalls(); public abstract void buildPillars(); private void buildFoundation() { System.out.println("Building foundation with cement,iron rods and sand"); } }
buildHouse()爲模版方法,它定義了執行指令順序由幾個步驟組成
咱們可能會有多種類型房屋,這裏以木質房,玻璃房爲例bash
WoodenHouse.javaide
package com.journaldev.design.template; public class WoodenHouse extends HouseTemplate { @Override public void buildWalls() { System.out.println("Building Wooden Walls"); } @Override public void buildPillars() { System.out.println("Building Pillars with Wood coating"); } }
GlassHouse.java測試
package com.journaldev.design.template; public class GlassHouse extends HouseTemplate { @Override public void buildWalls() { System.out.println("Building Glass Walls"); } @Override public void buildPillars() { System.out.println("Building Pillars with glass coating"); } }
HousingClient.javaui
package com.journaldev.design.template; public class HousingClient { public static void main(String[] args) { HouseTemplate houseType = new WoodenHouse(); //using template method houseType.buildHouse(); System.out.println("************"); houseType = new GlassHouse(); houseType.buildHouse(); } }
注意這裏調用調用基類的模板的方法,並根據不一樣的實施步驟,使用了從基類中繼承,一些在子類中的從新實現方法。
this
輸出結果:spa
Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.
實現要點:
1,模板方法應包括某些步驟的順序是固定的,對於某些方法,由不一樣子類具體去實現,模板方法應該是最終是固定的。
2, 大多數時候,子類調用從父類,但在模板模式的方法,父類的模板方法調用方法的子類,這是被稱爲好萊塢原則 - 「不給咱們打電話,咱們會打電話給你。」
3,在基類中的方法默認的實現被稱爲鉤,他們的目的是由子類重寫,若是你想使一些方法不能被覆蓋,你可使用final修飾,例如,在咱們的例子中,咱們能夠 使用final buildFoundation()修飾,由於咱們不想子類重寫它。
jdk中模版模式應用:
全部非抽象方法:
java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer.
java.util.AbstractList, java.util.AbstractSet and java.util.AbstractMap.
原文連接:http://www.journaldev.com/1763/template-method-design-pattern-in-java