Spring中的設計模式:模板模式

導讀

  • 模板模式在是Spring底層被普遍的應用,好比事務管理器的實現,JDBC模板的實現。
  • 文章首發於微信公衆號:設計模式:模板模式
  • 今天就來談談「什麼是模板模式」「模板模式的優缺點」「模板模式的簡單演示」「模板模式在Spring底層的實現」

什麼是模板模式

  • 模板模式首先要有一個抽象類,這個抽象類公開定義了執行它的方法的方式/模板。它的子類能夠按須要重寫方法實現,但調用將以抽象類中定義的方式進行。這種類型的設計模式屬於行爲型模式。
  • 定義:「定義一個操做中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類能夠不改變該算法結構的狀況下重定義該算法的某些特定步驟。」
  • 好比在造房子同樣,地基鋪線房子戶型都是同樣的,由開發商決定,可是在交房以後,室內的裝修風格場景佈置倒是由業主決定,在這個場景中,開發商其實就是一個抽象類,地基,鋪線,房子戶型都是能夠複用的,可是裝修倒是不可複用的,必須由業主決定,此時的每個業主的房子就是一個實現的子類。
  • 模板方法的實現條件注意:算法

    1. 必須是一個抽象類。
    2. 抽象類有一個模板方法,其中定義了算法骨架。
    3. 爲了防止惡意操做,模板方法必須加上final關鍵詞。
    4. 模板方法中除了複用的代碼,其餘的關鍵代碼必須是抽象的,子類能夠繼承實現。

優勢

  • 它封裝了不變部分,擴展可變部分。它把認爲是不變部分的算法封裝到父類中實現,而把可變部分算法由子類繼承實現,便於子類繼續擴展。
  • 它在父類中提取了公共的部分代碼,便於代碼複用。
  • 部分方法是由子類實現的,所以子類能夠經過擴展方式增長相應的功能,符合開閉原則。

缺點

  • 對每一個不一樣的實現都須要定義一個子類,這會致使類的個數增長,系統更加龐大,設計也更加抽象。
  • 父類中的抽象方法由子類實現,子類執行的結果會影響父類的結果,這致使一種反向的控制結構,它提升了代碼閱讀的難度。

簡單演示

  • 好比遊戲的運行須要以下幾個步驟:設計模式

    1. 初始化遊戲
    2. 開始遊戲
    3. 結束遊戲
  • 上述的三個步驟能夠是模板類的抽象方法,由具體的子類實現,好比足球遊戲。
  • 定義模板類,必須是一個抽象類,模板方法必須是final修飾。
public abstract class Game {

 //抽象方法

 abstract void initialize();

 abstract void startPlay();

 abstract void endPlay();

 //模板方法

 public final void play(){

 //初始化遊戲

 initialize();

 //開始遊戲

 startPlay();

 //結束遊戲

 endPlay();

 }

}
  • 定義實現類,足球遊戲,繼承模板類,實現其中的三個抽象方法
public class Football extends Game {
 
   @Override
   void endPlay() {
      System.out.println("足球遊戲結束......");
   }
 
   @Override
   void initialize() {
      System.out.println("足球遊戲初始化中......");
   }
 
   @Override
   void startPlay() {
      System.out.println("足球遊俠開始了......");
   }
}
  • 此時寫一個測試方法,運行足球遊戲,以下:
public class TemplatePatternDemo {
   public static void main(String[] args) {
      //建立足球遊戲實例
      Game game = new Football();
      //開始遊戲
      game.play();      
   }
}
  • 輸出結果以下:
足球遊戲初始化中......
足球遊俠開始了......
足球遊戲結束......

Spring中的模板模式

  • Spring底層對於模板模式的使用有不少處,今天陳某帶你們康康事務管理器是如何使用模板模式的。

模板抽象類

  • AbstractPlatformTransactionManager是Spring中的模板抽象類,來看看它的繼承關係圖:
  • 實現了PlatformTransactionManager接口,重載了接口中的方法。

模板方法

  • 事務管理器中抽象類中的模板方法不止一個,好比如下兩個方法
//提交事務
public final void commit()

//獲取TransactionStatus
public final TransactionStatus getTransaction()
  • 這兩個方法都對於本身要實現的邏輯搭建了一個骨架,主要的功能是由抽象方法完成,由子類來完成。

抽象方法

  • 事務管理器抽象類中的抽象方法定義了多個,分別用於處理不一樣的業務邏輯,由子類實現其中具體的邏輯,以下:
//提交事務
protected abstract void doCommit(DefaultTransactionStatus status);

//回滾事務
protected abstract void doRollback(DefaultTransactionStatus status);

//開始事務
protected abstract void doBegin(Object transaction, TransactionDefinition definition)

//獲取當前的事務對象
protected abstract Object doGetTransaction()
  • 抽象方法的定義便於子類去擴展,在保證算法邏輯不變的狀況下,子類可以定製本身的實現。

具體子類

  • 事務管理器的模板類有不少的具體子類,以下圖:
  • 其中咱們熟悉的有DataSourceTransactionManagerJtaTransactionManagerRabbitTransactionManager。具體承擔什麼樣的角色和責任不是本節的重點,再也不細說。

總結

  • 模板模式是一個很重要,易擴展的模式,提升了代碼複用性,在Spring中有着普遍的應用,好比JDBCTemplate,AbstractPlatformTransactionManager,這些實現都用到了模板模式。
  • 若是以爲陳某的文章可以對你有所幫助,有所啓發,關注分享一波,點個在看,謝謝支持!!!
相關文章
相關標籤/搜索