亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java設(shè)計(jì)模式之模板方法模式

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

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

一、概念理解

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

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

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

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

二、案例實(shí)現(xiàn)

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

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

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

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

我們用refresh()方法代表這個(gè)復(fù)雜的過(guò)程,在這個(gè)過(guò)程中應(yīng)該包括:

①開(kāi)始工作前的預(yù)處理;

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

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

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

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

抽象模板角色:

我們?cè)诔橄竽0褰巧袑?shí)現(xiàn)部分邏輯,而創(chuàng)建對(duì)象的容器obtainFreshBeanFactory()方法交給子類實(shí)現(xiàn),onRefresh()空方法交給子類實(shí)現(xiàn)便于擴(kuò)展。

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

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

        this.prepareRefresh();

        this.obtainFreshBeanFactory();

        this.onRefresh();
    }

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

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

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


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

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

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

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

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

客戶端-模擬容器啟動(dòng)過(guò)程:

/**
 * 容器啟動(dòng)過(guò)程
 * @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();

    }
}

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

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

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

相信通過(guò)這個(gè)案例的理解,大部分同學(xué)不僅能很好的理解模板方法模式,想必對(duì)Spring的啟動(dòng)過(guò)程也有了一個(gè)大概的了解。

三、總結(jié)

模板方法應(yīng)用場(chǎng)景太普遍了,在實(shí)際開(kāi)發(fā)中有多個(gè)子類共有的方法,并且邏輯相同,可以考慮使用模板方法模式。當(dāng)面對(duì)重要、復(fù)雜的算法,也可以把核心算法設(shè)計(jì)為模板方法模式,相關(guān)細(xì)節(jié)則由各個(gè)子類實(shí)現(xiàn)。

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

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

到此這篇關(guān)于Java設(shè)計(jì)模式之模板方法模式的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的IO流原理和流的分類詳解

    Java中的IO流原理和流的分類詳解

    這篇文章主要介紹了Java中的IO流原理和流的分類詳解,Java?io流是Java編程語(yǔ)言中用于輸入和輸出操作的一種機(jī)制。它提供了一組類和接口,用于處理不同類型的數(shù)據(jù)流,包括文件、網(wǎng)絡(luò)連接、內(nèi)存等,需要的朋友可以參考下
    2023-10-10
  • Spring源碼剖析之Spring處理循環(huán)依賴的問(wèn)題

    Spring源碼剖析之Spring處理循環(huán)依賴的問(wèn)題

    大家都知道循環(huán)依賴依賴指的是Bean與Bean之間的依賴關(guān)系,循環(huán)依賴指的是兩個(gè)或者多個(gè)Bean相互依賴,本文通過(guò)代碼示例給大家講解Spring處理循環(huán)依賴的問(wèn)題,感興趣的朋友一起看看吧
    2021-06-06
  • SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效問(wèn)題解決

    SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效問(wèn)題解決

    這篇文章主要介紹了SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Linux下java環(huán)境配置圖文方法

    Linux下java環(huán)境配置圖文方法

    這篇文章主要介紹了Linux下java環(huán)境配置圖文方法,需要的朋友可以參考下
    2023-06-06
  • Java8新特性時(shí)間日期庫(kù)DateTime API及示例詳解

    Java8新特性時(shí)間日期庫(kù)DateTime API及示例詳解

    這篇文章主要介紹了Java8新特性時(shí)間日期庫(kù)DateTime API及示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • SpringMVC之RequestContextHolder詳細(xì)解析

    SpringMVC之RequestContextHolder詳細(xì)解析

    這篇文章主要介紹了SpringMVC之RequestContextHolder詳細(xì)解析,正常來(lái)說(shuō)在service層是沒(méi)有request的,然而直接從controlller傳過(guò)來(lái)的話解決方法太粗暴,后來(lái)發(fā)現(xiàn)了SpringMVC提供的RequestContextHolder,需要的朋友可以參考下
    2023-11-11
  • IntelliJ IDEA Project窗口的一些設(shè)置詳解

    IntelliJ IDEA Project窗口的一些設(shè)置詳解

    這篇文章主要介紹了IntelliJ IDEA Project窗口的一些設(shè)置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 解決springboot+shiro+thymeleaf頁(yè)面級(jí)元素的權(quán)限控制問(wèn)題

    解決springboot+shiro+thymeleaf頁(yè)面級(jí)元素的權(quán)限控制問(wèn)題

    這篇文章主要介紹了解決springboot+shiro+thymeleaf頁(yè)面級(jí)元素的權(quán)限控制問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 你要知道IDEA的這些必備插件

    你要知道IDEA的這些必備插件

    這篇文章主要介紹了你要知道IDEA的這些必備插件,文中有非常詳細(xì)的圖文示例及代碼,對(duì)正在使用IDEA的小伙伴們有很好的幫助喲,需要的朋友可以參考下
    2021-05-05
  • SpringMVC異步處理操作(Callable和DeferredResult)

    SpringMVC異步處理操作(Callable和DeferredResult)

    這篇文章主要介紹了SpringMVC異步處理操作(Callable和DeferredResult),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01

最新評(píng)論