談一談我對‘模板方法’設計模式的理解(Template)

1、先嘮嘮嗑!

之因此想寫這個模板方法設計模式,我想純屬偶然!爲何呢?由於最近在看關於Spring框架的源代碼,剛開始看有點暈,由於你會被它全部類、接口的繼承關係所迷亂,不過當你知道了它是運用哪一種設計模式,那麼我想說再去看源代碼至少輪廓就清晰不少了!java

Spring框架用到的設計模式很是地多,好比Resource模塊運用了策略模式事務模塊運用了模板方法模式等等不少,我說不完,你們能夠自行谷哥之。算法

接下來我就解釋下什麼是模板方法模式,至於它在Spring中的應用,我打算以後再寫出一篇文章來進行總結!編程

2、什麼是模板方法設計模式?

模板模式是一種行爲設計模式,它的實現思路是,建立一個模板方法method,在該模板類中定義一些基本方法供模板方法method調用,這些基本方法一般是protected修飾的,由於它並不須要對外提供訪問。模板方法method定義了一個算法的執行步驟,或者說可以提供一種默認的實現,這種實現歸納一部分子類或者所有子類的共同部分(說白了就是歸納了全部子類的共同特性,而且本身實現了它)。設計模式

說到設計模式,不貼張UML圖出來我都以爲很差意思。bash

看到上面的UML圖,哈哈,不慌,很是地簡單!如今理清下思路,一個最基本的模板方法模式中,你須要建立一個抽象類和一個具體的實現類,從上圖能夠看到在抽象類中持有一個模板方法和一些基本方法,而子類只須要對這些基本方法進行實現便可,子類並不須要對模板方法進行實現,由於抽象類已經實現好了!併發

wokao,賊抽象有木有!下面我就引用一個例子對其進行說明:引用自併發編程網框架

假設提供一種造房子的算法。算法的步驟就是模擬造房子的過程:建地基、建支撐,最後添加牆和窗戶ide

    1. Fundation
    1. Pillars
    1. Walls
    1. Windows。

最重要的一點就是不能改變此建造過程(也就是咱們不能修改或者重寫模板方法的意思),好比不可能在沒用地基的時候就開始建造窗戶吧!若是能夠,那簡直是胡扯!。這個例子中,咱們就建立了一個模板方法 – 將使用不一樣的方法完成對房子的建造。ui

爲了確保子類不能重寫(override)這個模板方法,應當使用final。spa

HouseTemple.java(這個對應咱們上面UML圖中的AbstractClass)

package com.journaldev.design.template;
//抽象類
public abstract class HouseTemplate {

    //這是咱們的模板方法,子類不能重寫
    public final void buildHouse(){
        buildFoundation();//第一步:建造地基
        buildPillars();//第二步,建造支撐
        buildWalls();//第三步,建造牆
        buildWindows();//第四步,建造窗戶
        System.out.println("House is built.");
    }

    //這個步驟能夠默認實現,原文是private修飾,那麼就是說我規定死啦,這個步驟只能這樣實現了,但爲了易擴展,仍是protected OK點
    protected void buildWindows() {
        System.out.println("Building Glass Windows");
    }
    
    //被子類實現的方法
    protected abstract void buildWalls();
    protected abstract void buildPillars();
    
    protected void buildFoundation() {
        System.out.println("Building foundation with cement,iron rods and sand");
    }
}
複製代碼

下面就寫下具體的實現類:

WoodenHouse.java

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;</code>

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");
    }
}
複製代碼

使用模板方法:

package com.journaldev.design.template;

public class HousingClient {

    public static void main(String[] args) {
        //建立一個模板,子類由WoodenHouse實現
        HouseTemplate houseType = new WoodenHouse();

        houseType.buildHouse();//調用模板方法
        System.out.println("************");
        //建立一個模板,子類由GlassHouse實現
        houseType = new GlassHouse();
        houseType.buildHouse();//調用模板方法
    }
}
複製代碼

3、模板方法設計模式的特色

  • 一、模板方法不能被子類重寫,可用final修飾
  • 二、一個模板方法有肯定的步驟組成,這些步驟能夠被不一樣的子類實現,也能夠本身實現

4、模板方法設計模式應用場景

  • 一、對於一個業務方法步驟固定,但這些步驟能夠有不一樣的實現狀況下
  • 二、Spring JdbcTemplate、Spring Transaction中用到了
相關文章
相關標籤/搜索