設計模式之-模版方法(Template Method Design Pattern)

模板方法是一種行爲設計模式,它用於建立一個方法存根和推遲一些步驟執行的子類。模板方法定義的步驟來執行一個算法,它能夠提供一種多是共同的全部或一些子類的默認的實現。

讓咱們來了解這種模式有一個例子,假設咱們要提供一個算法來蓋房子。該步驟須要執行蓋房是 - 建築物地基,建築物的支柱,建築牆體和窗戶。最重要的一點是,咱們不能改變執行的順序,由於咱們不能創建在建地基前去建造窗戶。所以,在這種狀況下,咱們能夠建立將使用不一樣的方法來構建房子的模板方法。

如今全部類型的房子的地基都是是相同的,不管是它的一個木製的房子或是玻璃房子。所以,咱們能夠提供基本實現,若是子類須要重寫此方法,它們能夠從新實現內容,但大可能是很常見的房屋全部類型。
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.

Template Method Class Diagram




實現要點:

    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

相關文章
相關標籤/搜索