最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式模板方法模式(Template)用法解析

 更新時(shí)間:2019年11月18日 10:23:53   作者:brucegan  
這篇文章主要介紹了Java設(shè)計(jì)模式模板方法模式(Template)用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Java設(shè)計(jì)模式模板方法模式(Template)用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言:

  我們?cè)陂_(kāi)發(fā)中有很多固定的流程,這些流程有很多步湊是固定的,比如JDBC中獲取連接,關(guān)閉連接這些流程是固定不變的,變動(dòng)的只有設(shè)置參數(shù),解析結(jié)果集這些是根據(jù)不同的實(shí)體對(duì)象“來(lái)做調(diào)整”,針對(duì)這種擁有固定算法流程,其中有固定的步湊,存在不固定的步湊的情況下就誕生了模板方法模式。

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

  模板方法模式又叫模板模式,指的是父類定義了一個(gè)多步湊的算法骨架,其中很多步湊是在父類中實(shí)現(xiàn)了的,有的步湊是根據(jù)不同的子類擁有不同的實(shí)現(xiàn),就把這些“不確定”的實(shí)現(xiàn)步湊定義為抽象方法交給子類去實(shí)現(xiàn)。模板模式的核心就是在使子類不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步湊。屬于行為型設(shè)計(jì)模式。

應(yīng)用很廣發(fā),比如Mybatis中的BaseExecutor;Spring中的JdbcTemplate;Spring集成Hibernate中的HibernateTemplate,Spring集成各種Mq的Template,還有MongodbTemplate等......

模式中的角色:

  抽象類(AbstractClass):實(shí)現(xiàn)了模板方法,定義了算法的骨架。

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

代碼實(shí)現(xiàn):

  1:用抽象類定義流程,比如我們每天上班有個(gè)流程: 開(kāi)機(jī)-->寫(xiě)代碼(不同的程序員可能寫(xiě)不同的代碼-->關(guān)機(jī); 整個(gè)流程中開(kāi)機(jī)和關(guān)機(jī)是相同的,只是寫(xiě)代碼這個(gè)步湊不同,java程序員寫(xiě)java代碼,Php程序員寫(xiě)Php代碼; 我們先用一個(gè)抽象的父類定義這個(gè)流程:

public abstract class Work {

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

    //1:上班開(kāi)機(jī)
    openComputer();
    //2:搬磚:寫(xiě)代碼
    coding();
    //3:下班關(guān)機(jī)     closeComputer();
  }

  //開(kāi)機(jī)
  private final void openComputer() {
    System.out.println("到達(dá)公司,開(kāi)機(jī)");
  }

  //寫(xiě)代碼
  protected abstract void coding();

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

}

2:具體實(shí)現(xiàn)

Java程序員

public class JavaProgrammer extends Work {
  
  @Override
  protected void coding() {
    System.out.println("Java程序員打開(kāi)Idea,寫(xiě)Java代碼。。。");
  }
}

PHP程序員

public class PhpProgrammer extends Work {

  @Override
  protected void coding() {
    System.out.println("PHP程序員打開(kāi)Zend Studio,寫(xiě)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();
  }
}

運(yùn)行結(jié)果

模板模式在源碼中的體現(xiàn):

1:我們每天都在使用的HttpServlet里面的service方法,service方法里面定義了調(diào)用流程,根據(jù)客戶端調(diào)用的不同方式,if else邏輯判斷調(diào)用不同的方法,比如doGet,doPost,doDelete等實(shí)現(xiàn)restful調(diào)用,具體的doGet,doPost方法實(shí)現(xiàn)我們可以在我們自己定義的Servlet中進(jìn)行重寫(xiě)。

2:Mybatis框架中也有一些經(jīng)典實(shí)用,比如BaseExecutor類,它是一個(gè)基礎(chǔ)的SQL執(zhí)行類,實(shí)現(xiàn)了大部分SQL的執(zhí)行邏輯,然后把幾個(gè)方法教給子類定制化完成,源碼如下:

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

我們可以去看看具體每個(gè)子類的不同的實(shí)現(xiàn)。

模板模式的優(yōu)缺點(diǎn):

  優(yōu)點(diǎn):

  1:利用模板模式可以將相同處理邏輯的代碼放到抽象父類中,提高了代碼的復(fù)用性。

  2:將不同的邏輯放到不同的子類中,通過(guò)子類的擴(kuò)展增加新的行為,提高了代碼的擴(kuò)展性。

  3:把不變的行為寫(xiě)在父類中,去除了子類的重復(fù)代碼,提供了一個(gè)很好的代碼復(fù)用平臺(tái),符合開(kāi)閉原則。

  4:公司的高級(jí)工程師或者架構(gòu)師在項(xiàng)目前期可以利用模板模式定義好流程,讓其他編碼功工程師去實(shí)現(xiàn)具體。

  缺點(diǎn):

  1:每個(gè)抽象類都需要至少一個(gè)子類來(lái)實(shí)現(xiàn),導(dǎo)致了類數(shù)量的增加。

  2:類數(shù)量增加間接增加了系統(tǒng)的復(fù)雜性。

  3:因?yàn)槔^承關(guān)系的自身缺點(diǎn),如果父類添加一個(gè)新的抽象方法,素有子類都要實(shí)現(xiàn)一遍。

代碼鏈接:https://gitee.com/ganganbobo/gps-parent

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中數(shù)組的相關(guān)知識(shí)小結(jié)(推薦)

    java中數(shù)組的相關(guān)知識(shí)小結(jié)(推薦)

    下面小編就為大家?guī)?lái)一篇java中數(shù)組的相關(guān)知識(shí)小結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • Java隨機(jī)值設(shè)置(java.util.Random類或Math.random方法)

    Java隨機(jī)值設(shè)置(java.util.Random類或Math.random方法)

    在編程中有時(shí)我們需要生成一些隨機(jī)的字符串作為授權(quán)碼、驗(yàn)證碼等,以確保數(shù)據(jù)的安全性和唯一性,這篇文章主要給大家介紹了關(guān)于Java隨機(jī)值設(shè)置的相關(guān)資料,主要用的是java.util.Random類或Math.random()方法,需要的朋友可以參考下
    2024-08-08
  • Java?SpringBoot核心源碼詳解

    Java?SpringBoot核心源碼詳解

    這篇文章主要為大家介紹了Java?SpringBoot核心源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • java中幾種常見(jiàn)的排序算法總結(jié)

    java中幾種常見(jiàn)的排序算法總結(jié)

    大家好,本篇文章主要講的是java中幾種常見(jiàn)的排序算法總結(jié),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Struts2 OGNL表達(dá)式實(shí)例詳解

    Struts2 OGNL表達(dá)式實(shí)例詳解

    這篇文章主要介紹了Struts2 OGNL表達(dá)式實(shí)例詳解,相關(guān)實(shí)例代碼,需要的朋友可以參考。
    2017-09-09
  • 玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法

    玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法

    這篇文章主要介紹了玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法

    Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法

    這篇文章主要介紹了Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法,涉及java針對(duì)鼠標(biāo)事件及圖片操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 基于Maven的pom.xml文件詳解

    基于Maven的pom.xml文件詳解

    下面小編就為大家?guī)?lái)一篇基于Maven的pom.xml文件詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Mybatis日志參數(shù)快速替換占位符工具的詳細(xì)步驟

    Mybatis日志參數(shù)快速替換占位符工具的詳細(xì)步驟

    這篇文章主要介紹了Mybatis日志參數(shù)快速替換占位符工具的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • JAVA SE包裝類和泛型詳細(xì)介紹及說(shuō)明方法

    JAVA SE包裝類和泛型詳細(xì)介紹及說(shuō)明方法

    這篇文章主要介紹了JAVA SE包裝類和泛型的相關(guān)資料,包括基本數(shù)據(jù)類型與包裝類的對(duì)應(yīng)關(guān)系,以及裝箱和拆箱的概念,并重點(diǎn)講解了自動(dòng)裝箱和自動(dòng)拆箱的機(jī)制,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03

最新評(píng)論

克什克腾旗| 界首市| 南陵县| 双牌县| 揭西县| 和林格尔县| 原阳县| 白玉县| 揭西县| 五大连池市| 本溪市| 安阳市| 邳州市| 孝昌县| 阿克陶县| 郁南县| 时尚| 通许县| 三穗县| 三都| 顺昌县| 鲁甸县| 福海县| 左权县| 育儿| 周至县| 东乡| 二连浩特市| 安陆市| 南京市| 乌鲁木齐县| 天祝| 汉中市| 游戏| 客服| 乃东县| 卓尼县| 台山市| 和田市| 辽宁省| 岳阳市|