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

Java設計模式之模板方法模式

 更新時間:2022年10月20日 08:32:25   作者:tianClassmate  
這篇文章介紹了Java設計模式之模板方法模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在我們實際開發(fā)中,如果一個方法極其復雜時,如果我們將所有的邏輯寫在一個方法中,那維護起來就很困難,要替換某些步驟時都要重新寫,這樣代碼的擴展性就很差,當遇到這種情況就要考慮今天的主角——模板方法模式。

一、概念理解

模板方法模式的概念很簡單,在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。

既然概念叫“骨架”,那想當然的就是定義一個抽象類,這是模板方法模式的第一個角色——抽象模板角色,要有延遲子類實現(xiàn)骨架方法,這是模板方法的第二個角色——具體模板角色。

抽象模板角色:定義了一個或多個抽象操作,以便讓子類實現(xiàn)。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟,定義并實現(xiàn)了一個模板方法。

具體模板角色:實現(xiàn)父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。每一個抽象模板角色都可以有任意多個具體模板角色與之對應。

二、案例實現(xiàn)

在我們的業(yè)務開發(fā)中往往都需要很多對象、很多方法,對象間也大都存在依賴關系,如果我們手動創(chuàng)建、管理對象就是一件極其困難的事。

如果我們使用工廠模式用于創(chuàng)建對象,使用一個容器用于管理對象,那么再使用起來就變得極其簡單了。

在“這個過程”中創(chuàng)建對象就是一個很復雜的算法,而且創(chuàng)建對象的方式往往也不是單一的,我們要考慮能替換算法,這時候就可以使用模板方法模式。

假設創(chuàng)建對象有兩種方式,一種是基于注解,一種是基于xml,我們就將該方法定義為一個模板方法,基于注解和基于xml讓子類去實現(xiàn)。

我們用refresh()方法代表這個復雜的過程,在這個過程中應該包括:

①開始工作前的預處理;

②創(chuàng)建管理對象的容器(模板方法,基于注解和基于XML交給子類實現(xiàn));

③模板方法(交給子類,方便擴展);

④其他方法(容器刷新后、國際化、應用監(jiān)聽、發(fā)布事件,等等等一堆事)。

我們基于模板方法模式我們實現(xiàn)簡單的demo。

抽象模板角色:

我們在抽象模板角色中實現(xiàn)部分邏輯,而創(chuàng)建對象的容器obtainFreshBeanFactory()方法交給子類實現(xiàn),onRefresh()空方法交給子類實現(xiàn)便于擴展。

/**
 * 抽象模板角色
 * @author tcy
 * @Date 28-09-2022
 */
public abstract class AbstractApplicationContext {

    /**
     * 案例中容器和對象的創(chuàng)建全過程
     */
    public void refresh(){

        this.prepareRefresh();

        this.obtainFreshBeanFactory();

        this.onRefresh();
    }

    protected void prepareRefresh(){
        System.out.println("我用于開始工作前的預處理...");
    }

    protected void obtainFreshBeanFactory(){
        System.out.println("我用于創(chuàng)建默認管理對象的容器...");
    }

    /**
     * 模板方法,子類去實現(xiàn)[springboot實現(xiàn)了他,感興趣具體可以研究一下]
     */
    protected void onRefresh() {
    }


    protected void otherMethod(){
        System.out.println("容器刷新后、國際化、應用監(jiān)聽、發(fā)布事件,等等等,一堆事");
    }
}

具體模板角色-基于注解創(chuàng)建管理對象的容器

/**
 * 具體模板角色-基于注解
 * @author tcy
 * @Date 28-09-2022
 */
public class ApplicationContextAnnotation extends AbstractApplicationContext {
    @Override
    protected void obtainFreshBeanFactory() {
        System.out.println("這是基于注解的創(chuàng)建對象容器...");
    }
}

具體模板角色-基于xml創(chuàng)建管理對象的容器

/**
 * 具體模板角色-基于xml
 * @author tcy
 * @Date 28-09-2022
 */
public class ApplicationContextXml extends AbstractApplicationContext {
    @Override
    protected void obtainFreshBeanFactory() {
        System.out.println("這是xml的創(chuàng)建對象容器...");
    }
}

客戶端-模擬容器啟動過程:

/**
 * 容器啟動過程
 * @author tcy
 * @Date 28-09-2022
 */
public class Client {
    public static void main(String[] args) {

		//基于xml方式
        ApplicationContextXml applicationContextXml = new ApplicationContextXml();
        applicationContextXml.refresh();

		//基于注解方式
        ApplicationContextAnnotation annotation=new ApplicationContextAnnotation();
        annotation.refresh();

    }
}

我用于開始工作前的預處理...
這是xml的創(chuàng)建對象容器...
容器刷新后、國際化、應用監(jiān)聽、發(fā)布事件,等等等,一堆事
我用于開始工作前的預處理...
這是基于注解的創(chuàng)建對象容器...
容器刷新后、國際化、應用監(jiān)聽、發(fā)布事件,等等等,一堆事

對Spring源碼稍微有點了解的同學大概已經(jīng)知道,我們案例實現(xiàn)的正是簡易版的Spring的Refresh()方法,Refresh()方法是Spring最核心的方法,Spring良好的擴展性正是離不開模板方法模式的運用。下圖為Spring核心Refresh()方法的執(zhí)行大流程注釋。

在我們案例中的onRefresh()的空方法,實際中Springboot就是實現(xiàn)了這個空方法,onRefresh()方法調用了Tomcat的jar包啟動,這也是Springboot不需要手動注入Tomcat的原因。

相信通過這個案例的理解,大部分同學不僅能很好的理解模板方法模式,想必對Spring的啟動過程也有了一個大概的了解。

三、總結

模板方法應用場景太普遍了,在實際開發(fā)中有多個子類共有的方法,并且邏輯相同,可以考慮使用模板方法模式。當面對重要、復雜的算法,也可以把核心算法設計為模板方法模式,相關細節(jié)則由各個子類實現(xiàn)。

模板方法優(yōu)點突出:封裝不變部分,擴展可變部分;提取公共代碼,便于維護;行為由父類控制,子類實現(xiàn)。

模板方法的缺點很明顯,當方法實現(xiàn)過多的時候,每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),這必然導致類的個數(shù)增加,使得系統(tǒng)變得更加龐大。

到此這篇關于Java設計模式之模板方法模式的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java使用BigDecimal公式精確計算及精度丟失問題

    Java使用BigDecimal公式精確計算及精度丟失問題

    在工作中經(jīng)常會遇到數(shù)值精度問題,比如說使用float或者double的時候,可能會有精度丟失問題,下面這篇文章主要給大家介紹了關于Java使用BigDecimal公式精確計算及精度丟失問題的相關資料,需要的朋友可以參考下
    2023-01-01
  • SpringBoot 開發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

    SpringBoot 開發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

    這篇文章主要介紹了SpringBoot 開發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 一個依賴搞定?Spring?Boot?接口防盜刷的流程分析

    一個依賴搞定?Spring?Boot?接口防盜刷的流程分析

    kk-anti-reptile 是適用于基于 spring-boot 開發(fā)的分布式系統(tǒng)的反爬蟲組件,這篇文章主要介紹了一個依賴搞定?Spring?Boot?接口防盜刷,需要的朋友可以參考下
    2022-06-06
  • 通過實例解析java8中的parallelStream

    通過實例解析java8中的parallelStream

    這篇文章主要介紹了通過實例解析java8中的parallelStream,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 基于Java回顧之I/O的使用詳解

    基于Java回顧之I/O的使用詳解

    我計劃在接下來的幾篇文章中快速回顧一下Java,主要是一些基礎的JDK相關的內(nèi)容
    2013-05-05
  • Spring運行時動態(tài)注冊bean的方法

    Spring運行時動態(tài)注冊bean的方法

    這篇文章主要介紹了Spring運行時動態(tài)注冊bean的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • mybatis如何處理返回結果集

    mybatis如何處理返回結果集

    這篇文章主要介紹了mybatis如何處理返回結果集問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳細介紹MyBatis 3.4.0版本的功能

    詳細介紹MyBatis 3.4.0版本的功能

    這篇文章主要給大家介紹了關于MyBatis 3.4.0版本的功能,文中只列舉部分重要的內(nèi)容,詳細內(nèi)容看官方說明,需要的朋友可以參考借鑒,下面跟著小編一起來學習學習吧。
    2017-06-06
  • Java多線程中的Phaser使用解析

    Java多線程中的Phaser使用解析

    這篇文章主要介紹了Java多線程中的Phaser使用解析,java多線程技術提供了Phaser工具類,Phaser表示“階段器”,用來解決控制多個線程分階段共同完成任務的情景問題,其作用相比CountDownLatch和CyclicBarrier更加靈活,需要的朋友可以參考下
    2023-11-11
  • 使用StringRedisTemplate操作Redis方法詳解

    使用StringRedisTemplate操作Redis方法詳解

    這篇文章主要為大家介紹了使用StringRedisTemplate操作Redis方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論

乐清市| 景东| 内黄县| 中西区| 泾阳县| 博白县| 河源市| 西充县| 镇雄县| 伽师县| 安泽县| 五家渠市| 罗定市| 镶黄旗| 库伦旗| 历史| 武汉市| 晋宁县| 三门县| 若尔盖县| 法库县| 绿春县| 镇康县| 天柱县| 兴山县| 晋江市| 新民市| 无锡市| 永年县| 永兴县| 桐柏县| 屏东市| 涡阳县| 墨江| 河东区| 湖口县| 花莲县| 湖南省| 宜兰市| 益阳市| 中阳县|