设计模式之模板方法
模板方法介紹
模板方法模式是一種行為設(shè)計(jì)模式,它在超類中定義一個(gè)算法的框架,允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟。
模板模板方法模式建議將算法分解為一系列步驟,然后將這些步驟改為方法,最后在“模板方法”中依次調(diào)用這些方法。
步驟可以是抽象的,也可以有一些默認(rèn)的實(shí)現(xiàn)。為了能夠使用算法,客戶端需要自行提供子類并實(shí)現(xiàn)所有的抽象步驟(有時(shí)候還需要重寫步驟)。
模板方法將算法分解為步驟,并允許子類重寫這些步驟,而非重寫實(shí)際的模板方法。
分解步驟
1、抽取步驟必須由各個(gè)子類來(lái)實(shí)現(xiàn);
2、可選步驟已有一些默認(rèn)實(shí)現(xiàn),但仍可在需要時(shí)進(jìn)行重寫。
模板方法的結(jié)構(gòu)
1、抽象類
聲明作為算法步驟的方法,以及依次調(diào)用它們的實(shí)際模板方法。
算法步驟可以被聲明為抽象類,默認(rèn)提供一些實(shí)現(xiàn)。
2、具體類
實(shí)現(xiàn)抽象方法的類,重寫所有步驟,但不能重寫模板方法自身。
適合場(chǎng)景
1、當(dāng)希望客戶端擴(kuò)展某個(gè)特定算法步驟,而不是整個(gè)算法或其結(jié)構(gòu)時(shí)。
2、當(dāng)多個(gè)類的算法除了一些細(xì)微不同之處幾乎完全一樣時(shí)。
實(shí)現(xiàn)方式
1、分析目標(biāo)算法,確定能否將其分解為多個(gè)步驟(從所有子類的角度出發(fā),考慮哪些步驟能夠通用,那些步驟各不相同)。
2、創(chuàng)建抽象基類并聲明一個(gè)模板方法和代表算法步驟的一系列抽象方法(在模板方法中根據(jù)算法結(jié)構(gòu)依次調(diào)用相應(yīng)步驟)。
對(duì)于默認(rèn)的實(shí)現(xiàn),可以給部分步驟帶來(lái)好處。同時(shí)可以考慮在算法的關(guān)鍵之間添加鉤子。
3、為每個(gè)算法變體新建一個(gè)具體子類,它必須實(shí)現(xiàn)所有的抽象步驟,也可以重寫部分可選步驟。
優(yōu)點(diǎn)
1、你可僅允許客戶端重寫一個(gè)大型算法中的特定部分,使得算法其他部分修改對(duì)其所造成的影響減小。
2、可將重復(fù)的代碼提取到一個(gè)超類中。
缺點(diǎn)
1、部分客戶端會(huì)受到算法框架的限制。
2、會(huì)導(dǎo)致違法里氏替換原則,通過(guò)子類抑制默認(rèn)步驟。
3、模板方法中步驟越多,后期的維護(hù)成本會(huì)增大。
Demo
它在基類中定義了一個(gè)算法的框架,允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟。
通常使用此模板方法來(lái)向框架用戶提供通過(guò)繼承實(shí)現(xiàn)的、對(duì)標(biāo)準(zhǔn)功能進(jìn)行擴(kuò)展的簡(jiǎn)單方式
提供的抽象類
抽象類實(shí)現(xiàn)抽象類的具體類
實(shí)現(xiàn)抽象類客戶端和Main方法業(yè)務(wù)邏輯
客戶端和Main方法首先我們可以看到在提供的抽象方法中,有一個(gè)模板方法,此方法用于執(zhí)行基類聲明的算法步驟。后面客戶端只需要調(diào)用此方法就可以完成交給不同子類的業(yè)務(wù)。
不同的子類,由于繼承相同的抽象類,首先必須實(shí)現(xiàn)抽象方法,其次可根據(jù)每個(gè)子類的業(yè)務(wù)需求各自來(lái)實(shí)現(xiàn)某些鉤子方法,此方法用于在子類中超長(zhǎng)發(fā)揮,各自都可以對(duì)進(jìn)行變更,彼此不受影響。最后想要實(shí)現(xiàn)的是,我調(diào)用同樣的方法代碼,后面聲明實(shí)現(xiàn)的兩個(gè)類會(huì)得到不同的顯示結(jié)果。
顯示的不同結(jié)果由于1號(hào)沒(méi)有重寫鉤子方法,2號(hào)重寫了。所以當(dāng)在模板方法中調(diào)用One()時(shí),1號(hào)沒(méi)有進(jìn)行任何操作,執(zhí)行的是抽象類中的空方法,而2號(hào)重寫了,則輸出了重寫的方法。
小寄語(yǔ)
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創(chuàng)不易,給個(gè)關(guān)注。
我是阿輝,感謝您的閱讀,如果對(duì)你有幫助,麻煩點(diǎn)贊、轉(zhuǎn)發(fā) ?謝謝。
往期推薦
設(shè)計(jì)模式總覽
設(shè)計(jì)模式之簡(jiǎn)單工廠
設(shè)計(jì)模式之抽象工廠
設(shè)計(jì)模式之建造者
設(shè)計(jì)模式之原型
設(shè)計(jì)模式之單例
設(shè)計(jì)模式之適配器
設(shè)計(jì)模式之橋接
設(shè)計(jì)模式之組合
設(shè)計(jì)模式之裝飾器
設(shè)計(jì)模式之外觀
設(shè)計(jì)模式之享元
設(shè)計(jì)模式之代理
設(shè)計(jì)模式之責(zé)任鏈
設(shè)計(jì)模式之命令
設(shè)計(jì)模式之迭代器
設(shè)計(jì)模式之中介者
設(shè)計(jì)模式之備忘錄
設(shè)計(jì)模式之觀察者
設(shè)計(jì)模式之狀態(tài)
設(shè)計(jì)模式之策略
總結(jié)
- 上一篇: 对DDD的常见误区
- 下一篇: 强制升级?!.NET Core 2.1容