RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何通過模板模式重構(gòu)代碼

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 16:15 ? 次閱讀

1、什么是模板模式?

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

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

說人話:父類模板方法定義不變的流程,子類重寫流程中的方法。

2、模板模式定義

圖片

①、AbstractClass 抽象模板

一、基本方法

上面的 baseOperation() 或者 customOperation() 方法,也叫基本操作,是由子類實(shí)現(xiàn)的方法,并且在模板方法中被調(diào)用。

基本方法盡量設(shè)計(jì)為protected類型, 符合迪米特法則, 不需要暴露的屬性或方法盡量不要設(shè)置為protected類型。實(shí)現(xiàn)類若非必要, 盡量不要擴(kuò)大父類中的訪權(quán)限。

二、模板方法

上面的 templateMethod() 方法,可以有一個(gè)或者幾個(gè),實(shí)現(xiàn)對(duì)基本方法的調(diào)度,完成固定的邏輯。

為了防止惡意操作,通常模板方法都加上 final 關(guān)鍵字,不允許覆寫。

②、ConcreteClass 具體模板

實(shí)現(xiàn)父類定義的一個(gè)或多個(gè)抽象方法,也就是父類定義的基本方法在子類中得以實(shí)現(xiàn)。

3、模板模式通用代碼

public abstract class AbstractClass {
    // 共同的且繁瑣的操作
    private void baseOperation() {
        // do something
    }

    // 由子類定制的操作
    protected abstract void customOperation();

    // 模板方法定義的框架
    public final void templateMethod() {
        /**
         * 調(diào)用基本方法,完成固定邏輯
         */
        baseOperation();
        customOperation();
    }

}
public class ConcreteClass1 extends AbstractClass{

    @Override
    protected void customOperation() {
        // 具體模板1 業(yè)務(wù)邏輯
        System.out.println("具體模板1:customOperation()");
    }
}
public class ConcreteClass2 extends AbstractClass{
    @Override
    protected void customOperation() {
        // 具體模板2 業(yè)務(wù)邏輯
        System.out.println("具體模板2:customOperation()");
    }
}

測(cè)試:

public class TemplateClient {
    public static void main(String[] args) {
        AbstractClass abstractClass1 = new ConcreteClass1();
        AbstractClass abstractClass2 = new ConcreteClass2();
        applyTemplate(abstractClass1);
        applyTemplate(abstractClass2);
    }

    public static void applyTemplate(AbstractClass abstractClass){
        abstractClass.templateMethod();
    }
}

4、模板模式優(yōu)點(diǎn)

①、封裝不變部分, 擴(kuò)展可變部分

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

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

③、行為由父類控制, 子類實(shí)現(xiàn)

基本方法是由子類實(shí)現(xiàn)的, 因此子類可以通過擴(kuò)展的方式增加相應(yīng)的功能, 符合開閉原則。

5、模板模式缺點(diǎn)

①、子類執(zhí)行的結(jié)果影響了父類的結(jié)果,這和我們平時(shí)設(shè)計(jì)習(xí)慣顛倒了,在復(fù)雜項(xiàng)目中,會(huì)帶來閱讀上的難度。

②、可能引起子類泛濫和為了繼承而繼承的問題

6、回調(diào)

為了解決模板模式的缺點(diǎn),我們可以利用回調(diào)函數(shù)代替子類繼承。

圖片

public interface Callback {
    void customOperation();
}
public class SubCallback implements Callback{
    @Override
    public void customOperation() {
        System.out.println("SubCallback customOperation");
    }
}
/**
 * 模板類
 * 聲明為 final,無法被繼承
 */
public final class Template {
    private void baseOperation(){
        System.out.println("模板類公共操作");
    }

    public void templateMethod(Callback callback){
        baseOperation();
        callback.customOperation();
    }
}

測(cè)試:

public class TemplateClient {
    public static void main(String[] args) {
        Template template = new Template();
        applyTemplate(template);
    }

    public static void applyTemplate(Template template){
        Callback callback = new SubCallback();
        template.templateMethod(callback);
    }
}

Template是一個(gè)穩(wěn)定的final類,無法被繼承,不存在子類行為影響父類結(jié)果的問題,而Callback是一個(gè)接口,為了繼承而繼承的問題消失了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 封裝
    +關(guān)注

    關(guān)注

    126

    文章

    7873

    瀏覽量

    142893
  • 模板
    +關(guān)注

    關(guān)注

    0

    文章

    108

    瀏覽量

    20560
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4327

    瀏覽量

    62569
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    改善代碼質(zhì)量的6種重構(gòu)模式

    根據(jù)上面所討論的代碼壞味道,下面給出可以有效解決這些問題的6種重構(gòu)模式,合理使用這些模式能夠幫你解決大多數(shù)的代碼質(zhì)量問題并成為一名更優(yōu)秀的開發(fā)者。1.抽取類與移動(dòng)方法:如上所述,諸如過
    發(fā)表于 12-12 16:09

    為什么要重構(gòu)?如何重組Python包?

    導(dǎo)航時(shí),它們也是您最好的GPS導(dǎo)航器?! ¢_始重構(gòu)—重組/重組  在本節(jié)中,我將config.py通過重組結(jié)構(gòu),合并重復(fù)的方法,分解和編寫測(cè)試代碼以確保向后兼容性,向您展示一個(gè)示例
    發(fā)表于 09-15 15:28

    基于ATmega162的自重構(gòu)機(jī)器人控制模式

    本文通過對(duì)自重構(gòu)機(jī)器人的特點(diǎn)和總體結(jié)構(gòu)進(jìn)行分析,提出一種基于ATmega162 的部分主從分布式控制模式,該模式利用ATmega162 的外擴(kuò)存儲(chǔ)器功能實(shí)現(xiàn)擴(kuò)展總線,從而對(duì)自
    發(fā)表于 06-18 10:49 ?39次下載

    模板方法模式在回溯算法中的應(yīng)用

    描述了模板方法模式及回溯算法的模板方法模式的Java 語言實(shí)現(xiàn),該實(shí)現(xiàn)使得回溯算法的實(shí)現(xiàn)達(dá)到了可擴(kuò)展性、靈活性和可插入性三個(gè)目標(biāo),提高了算法的可維護(hù)性和可復(fù)用性。
    發(fā)表于 01-15 16:48 ?20次下載

    模板方法模式在回溯算法中的應(yīng)用

    描述了模板方法模式及回溯算法的模板方法模式的Java 語言實(shí)現(xiàn),該實(shí)現(xiàn)使得回溯算法的實(shí)現(xiàn)達(dá)到了可擴(kuò)展性、靈活性和可插入性三個(gè)目標(biāo),提高了算法的可維護(hù)性和可復(fù)用性。
    發(fā)表于 01-15 16:51 ?0次下載

    一種基于體系結(jié)構(gòu)模板的粗粒度可重構(gòu)SoC設(shè)計(jì)方法

    針對(duì)傳統(tǒng)的面向應(yīng)用領(lǐng)域的多核SoC體系結(jié)構(gòu)設(shè)計(jì)方法存在系統(tǒng)結(jié)構(gòu)探索空間大、設(shè)計(jì)復(fù)雜度高等問題,提出了一種基于體系結(jié)構(gòu)模板的粗粒度可重構(gòu)SoC系統(tǒng)架構(gòu)設(shè)計(jì)方法。該設(shè)計(jì)方法以體系結(jié)構(gòu)設(shè)計(jì)為中心,體系結(jié)構(gòu)模板
    發(fā)表于 11-29 10:12 ?0次下載
    一種基于體系結(jié)構(gòu)<b class='flag-5'>模板</b>的粗粒度可<b class='flag-5'>重構(gòu)</b>SoC設(shè)計(jì)方法

    使用英特爾SIMD數(shù)據(jù)布局模板提高矢量化效率

    了解英特爾?SIMD數(shù)據(jù)布局模板(英特爾?SDLT)可通過指定首選SIMD數(shù)據(jù)布局來提高性能,而無需重構(gòu)代碼
    的頭像 發(fā)表于 11-05 07:10 ?2086次閱讀

    MM32單片機(jī)的模板代碼合集免費(fèi)下載

      本文檔的主要內(nèi)容詳細(xì)介紹的是MM32單片機(jī)的模板代碼合集免費(fèi)下載。
    發(fā)表于 10-14 17:16 ?363次下載
    MM32單片機(jī)的<b class='flag-5'>模板</b><b class='flag-5'>代碼</b>合集免費(fèi)下載

    HarmonyOS如何自動(dòng)生成JS FA調(diào)用Java PA的模板代碼

    模板代碼,且模板代碼可能與業(yè)務(wù)代碼相互耦合,使得代碼可維護(hù)性和可讀性較差。于是,js2java-
    的頭像 發(fā)表于 09-28 10:09 ?2130次閱讀

    SOC課程——③——Verilog程序(典型電路的模板

    典型電路的模板1 模板代碼1.1 輸出時(shí)序邏輯的模板代碼1.1.1 異步復(fù)位的時(shí)序電路(用的最多)1.1.2 同步復(fù)位的時(shí)序電路1.2 輸出
    發(fā)表于 12-22 18:57 ?4次下載
    SOC課程——③——Verilog程序(典型電路的<b class='flag-5'>模板</b>)

    重構(gòu)或重新設(shè)計(jì)時(shí)驗(yàn)證代碼

      與重新設(shè)計(jì)相反,重構(gòu)是一種優(yōu)化代碼內(nèi)部實(shí)現(xiàn)的努力,以提高其可維護(hù)性并降低其總體運(yùn)營成本。和許多人一樣,我相信軟件重構(gòu)的最佳定義之一是由Martin Fowler在他的“重構(gòu)書”中寫
    的頭像 發(fā)表于 11-25 15:17 ?435次閱讀

    如何借助GPT-4評(píng)審、重構(gòu)代碼?

    重構(gòu)代碼之所以重要,有以下幾個(gè)原因:它增強(qiáng)了可讀性和可維護(hù)性,使開發(fā)人員更容易理解和修改代碼。它還有助于防止?jié)撛诘腻e(cuò)誤,并確保您的代碼遵循已建立的最佳實(shí)踐。最終,
    的頭像 發(fā)表于 03-31 09:27 ?2785次閱讀

    設(shè)計(jì)模式行為型:模板方法模式

    模板模式中,一個(gè)抽象類公開定義了執(zhí)行它的方法的方式/模板。
    的頭像 發(fā)表于 06-07 15:13 ?582次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>行為型:<b class='flag-5'>模板</b>方法<b class='flag-5'>模式</b>

    代碼重構(gòu)的經(jīng)驗(yàn)總結(jié)

    具體的重構(gòu)手段可參考《代碼大全2》或《重構(gòu):改善既有代碼的設(shè)計(jì)》,本文不再班門弄斧,而側(cè)重重構(gòu)時(shí)一些粗淺的“方法論”,旨在提高
    的頭像 發(fā)表于 08-23 10:10 ?596次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>重構(gòu)</b>的經(jīng)驗(yàn)總結(jié)

    重構(gòu):改善既有代碼的設(shè)計(jì)」實(shí)戰(zhàn)篇

    代碼層面的整理,它更是一種軟件開發(fā)的哲學(xué),強(qiáng)調(diào)持續(xù)改進(jìn)和適應(yīng)變化的重要性。 ? ? 書中通過詳細(xì)的案例分析和代碼示例,將理論與實(shí)踐巧妙地融合在一起。我尤其贊賞作者 如何將復(fù)雜的重構(gòu)任務(wù)
    的頭像 發(fā)表于 08-14 10:42 ?248次閱讀
    「<b class='flag-5'>重構(gòu)</b>:改善既有<b class='flag-5'>代碼</b>的設(shè)計(jì)」實(shí)戰(zhàn)篇
    RM新时代网站-首页