1. 程式人生 > 程式設計 >Java設計模式模板方法模式(Template)用法解析

Java設計模式模板方法模式(Template)用法解析

這篇文章主要介紹了Java設計模式模板方法模式(Template)用法解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言:

  我們在開發中有很多固定的流程,這些流程有很多步湊是固定的,比如JDBC中獲取連線,關閉連線這些流程是固定不變的,變動的只有設定引數,解析結果集這些是根據不同的實體物件“來做調整”,針對這種擁有固定演算法流程,其中有固定的步湊,存在不固定的步湊的情況下就誕生了模板方法模式。

模板方法模式(Template)定義:

  模板方法模式又叫模板模式,指的是父類定義了一個多步湊的演算法骨架,其中很多步湊是在父類中實現了的,有的步湊是根據不同的子類擁有不同的實現,就把這些“不確定”的實現步湊定義為抽象方法交給子類去實現。模板模式的核心就是在使子類不改變演算法結構的情況下,重新定義演算法的某些步湊。屬於行為型設計模式。

應用很廣發,比如Mybatis中的BaseExecutor;Spring中的JdbcTemplate;Spring整合Hibernate中的HibernateTemplate,Spring整合各種Mq的Template,還有MongodbTemplate等......

模式中的角色:

  抽象類(AbstractClass):實現了模板方法,定義了演算法的骨架。

  具體類 (Concrete):實現了抽象類中抽象放,使得父類定義的演算法更完整。

程式碼實現:

  1:用抽象類定義流程,比如我們每天上班有個流程: 開機-->寫程式碼(不同的程式設計師可能寫不同的程式碼-->關機; 整個流程中開機和關機是相同的,只是寫程式碼這個步湊不同,java程式設計師寫java程式碼,Php程式設計師寫Php程式碼; 我們先用一個抽象的父類定義這個流程:

public abstract class Work {

  //定義演算法步湊流程
  public void workDay(){

    //1:上班開機
    openComputer();
    //2:搬磚:寫程式碼
    coding();
    //3:下班關機     closeComputer();
  }

  //開機
  private final void openComputer() {
    System.out.println("到達公司,開機");
  }

  //寫程式碼
  protected abstract void coding();

  //關機
  private final void closeComputer() {
    System.out.println("下班,關機");
  }

}

2:具體實現

Java程式設計師

public class JavaProgrammer extends Work {
  
  @Override
  protected void coding() {
    System.out.println("Java程式設計師開啟Idea,寫Java程式碼。。。");
  }
}

PHP程式設計師

public class PhpProgrammer extends Work {

  @Override
  protected void coding() {
    System.out.println("PHP程式設計師開啟Zend Studio,寫Php程式碼。。。");
  }
}

3:使用

public class TemplateMethodDemo {

  public static void main(String[] args) {
    Work javaProgrammer = new JavaProgrammer();
    javaProgrammer.workDay();
    System.out.println("================");
    Work phpProgrammer = new PhpProgrammer();
    phpProgrammer.workDay();
  }
}

執行結果

模板模式在原始碼中的體現:

1:我們每天都在使用的HttpServlet裡面的service方法,service方法裡面定義了呼叫流程,根據客戶端呼叫的不同方式,if else邏輯判斷呼叫不同的方法,比如doGet,doPost,doDelete等實現restful呼叫,具體的doGet,doPost方法實現我們可以在我們自己定義的Servlet中進行重寫。

2:Mybatis框架中也有一些經典實用,比如BaseExecutor類,它是一個基礎的SQL執行類,實現了大部分SQL的執行邏輯,然後把幾個方法教給子類定製化完成,原始碼如下:

其中doUpdate(),doFlushStatements(),doQuery(),doQueryCursor()等方法都是由子類來實現的,BaseExecutor有那些子類呢?我們來看一下他的類圖:

我們可以去看看具體每個子類的不同的實現。

模板模式的優缺點:

  優點:

  1:利用模板模式可以將相同處理邏輯的程式碼放到抽象父類中,提高了程式碼的複用性。

  2:將不同的邏輯放到不同的子類中,通過子類的擴充套件增加新的行為,提高了程式碼的擴充套件性。

  3:把不變的行為寫在父類中,去除了子類的重複程式碼,提供了一個很好的程式碼複用平臺,符合開閉原則。

  4:公司的高階工程師或者架構師在專案前期可以利用模板模式定義好流程,讓其他編碼功工程師去實現具體。

  缺點:

  1:每個抽象類都需要至少一個子類來實現,導致了類數量的增加。

  2:類數量增加間接增加了系統的複雜性。

  3:因為繼承關係的自身缺點,如果父類新增一個新的抽象方法,素有子類都要實現一遍。

程式碼連結:https://gitee.com/ganganbobo/gps-parent

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。