溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么使用java模板方法模式

發(fā)布時(shí)間:2021-11-17 11:10:37 來(lái)源:億速云 閱讀:141 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“怎么使用java模板方法模式”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

定義

模板方法模式(Template Method Pattern)- 定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類(lèi)中。使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟

簡(jiǎn)單來(lái)說(shuō),就是把可變的部分(方法)放在子類(lèi)中實(shí)現(xiàn),把不可變的部分放在父類(lèi)中實(shí)現(xiàn)

舉個(gè)例子,假如你賺錢(qián)了買(mǎi)了個(gè)房子,交房之后是個(gè)毛坯需要裝修,裝修的流程是水電、泥工、木工、再買(mǎi)家具電器等,這時(shí)關(guān)于裝修哪種風(fēng)格有了不同意見(jiàn),你自己喜歡簡(jiǎn)約時(shí)尚的風(fēng)格,而你爸媽喜歡中式風(fēng)格,可不管是什么風(fēng)格,整個(gè)裝修的流程還是不變的,于是可以找裝修公司制定兩種風(fēng)格的方案,這其中變化的是兩種風(fēng)格各個(gè)流程的具體材料、做工不同,不變的是裝修的流程

模板方法結(jié)構(gòu)

通用類(lèi)圖

怎么使用java模板方法模式

使用模板方法模式很簡(jiǎn)單,使用Java的繼承機(jī)制即可,這里有兩種角色

  • 抽象模板(AbstractClass):提供模板方法,讓子類(lèi)實(shí)現(xiàn)基本方法

    • 基本方法:

      基本方法也叫做基本操作,是由子類(lèi)實(shí)現(xiàn)的方法,并且在模板方法被調(diào)用

    • 模板方法:

      可以有一個(gè)或幾個(gè),一般是一個(gè)具體方法,也就是一個(gè)框架,實(shí)現(xiàn)對(duì)基本方法的調(diào)度,完成固定的邏輯

  • 具體模板(ConcreteClass):實(shí)現(xiàn)父類(lèi)所定義的一個(gè)或多個(gè)抽象方法,也就是父類(lèi)定義的基本方法在子類(lèi)中得以實(shí)現(xiàn)

一般模板方法可以用final修飾,這樣子類(lèi)不能重寫(xiě),避免被修改

優(yōu)點(diǎn)以應(yīng)用場(chǎng)景

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

  • 封裝不變部分,擴(kuò)展可變部分。把認(rèn)為是不變部分的算法封裝到父類(lèi)實(shí)現(xiàn),而可變部分的則可以通過(guò)繼承來(lái)繼續(xù)擴(kuò)展

  • 提取公共部分代碼,便于維護(hù)

  • 行為由父類(lèi)控制,子類(lèi)實(shí)現(xiàn)。子類(lèi)可以通過(guò)擴(kuò)展的方式增加相應(yīng)的功能,符合開(kāi)閉原則

應(yīng)用場(chǎng)景

  • 多個(gè)子類(lèi)有公有的方法,并且邏輯基本相同時(shí)

  • 重要、復(fù)雜的算法,可以把核心算法設(shè)計(jì)為模板方法,周邊的相關(guān)細(xì)節(jié)功能則由各個(gè)子類(lèi)實(shí)現(xiàn)

  • 重構(gòu)時(shí),模板方法模式是一個(gè)經(jīng)常使用的模式,把相同的代碼抽取到父類(lèi)中,然后通過(guò)鉤子函數(shù)約束其行為

實(shí)例

統(tǒng)計(jì)操作時(shí)間

抽象模板,用于給操作統(tǒng)計(jì)時(shí)間,其中getTime()為模板方法,用于統(tǒng)計(jì)操作時(shí)間,該行為交給父類(lèi)控制,code()鉤子方法延遲到子類(lèi)中實(shí)現(xiàn)

public abstract class GetTimeTemplate {

    /**
     * 基本方法,由子類(lèi)實(shí)現(xiàn) (鉤子方法)
     */
    public abstract void code();

    /**
     * 模板方法 固定流程方法
     */
    public long getTime() {
        // 獲取起始時(shí)間
        long t1 = System.currentTimeMillis();

        // 調(diào)用基本方法
        code();

        // 獲取結(jié)束時(shí)間
        long t2 = System.currentTimeMillis();
        return t2 - t1;
    }
}

具體模板實(shí)現(xiàn) - 統(tǒng)計(jì)復(fù)制文件操作時(shí)間

public class CopyFileDemo extends GetTimeTemplate {
    @Override
    public void code() {
        //復(fù)制文件
        try {
            BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("1.jpg"));

            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("2.jpg"));

            byte[] bs = new byte[256];
            int len = 0;

            while ((len = inputStream.read(bs)) != -1) {
                outputStream.write(bs, 0, len);
                outputStream.flush();
            }
            //釋放資源
            inputStream.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

具體模板實(shí)現(xiàn) - 統(tǒng)計(jì)循環(huán)操作時(shí)間

public class ForDemo extends GetTimeTemplate {
    @Override
    public void code() {
        //輸出for循環(huán)
        for (int i = 0; i < 10000; i++) {
            System.out.println(i);
        }
    }
}

“怎么使用java模板方法模式”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI