Java設計模式之模板方法模式(Template)

前言:php

  咱們在開發中有不少固定的流程,這些流程有不少步湊是固定的,好比JDBC中獲取鏈接,關閉鏈接這些流程是固定不變的,變更的只有設置參數,解析結果集這些是根據不一樣的實體對象「來作調整」,針對這種擁有固定算法流程,其中有固定的步湊,存在不固定的步湊的狀況下就誕生了模板方法模式。java

模板方法模式(Template)定義:程序員

  模板方法模式又叫模板模式,指的是父類定義了一個多步湊的算法骨架,其中不少步湊是在父類中實現了的,有的步湊是根據不一樣的子類擁有不一樣的實現,就把這些「不肯定」的實現步湊定義爲抽象方法交給子類去實現。模板模式的核心就是在使子類不改變算法結構的狀況下,從新定義算法的某些步湊。屬於行爲型設計模式。應用很廣發,好比Mybatis中的BaseExecutor;Spring中的JdbcTemplate;Spring集成Hibernate中的HibernateTemplate,Spring集成各類Mq的Template,還有MongodbTemplate等......算法

模式中的角色:設計模式

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

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

代碼實現:框架

  1:用抽象類定義流程,好比咱們天天上班有個流程: 開機-->寫代碼(不一樣的程序員可能寫不一樣的代碼-->關機; 整個流程中開機和關機是相同的,只是寫代碼這個步湊不一樣,java程序員寫java代碼,Php程序員寫Php代碼; 咱們先用一個抽象的父類定義這個流程:ide

 

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:由於繼承關係的自身缺點,若是父類添加一個新的抽象方法,素有子類都要實現一遍。

相關文章
相關標籤/搜索