摘要:模版方法由抽象類聲明并加以實(shí)現(xiàn)。抽象類中的模版方法正是通過(guò)實(shí)現(xiàn)類擴(kuò)展的方法來(lái)完成業(yè)務(wù)邏輯。一般來(lái)說(shuō),抽象類中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過(guò)增加實(shí)現(xiàn)類一般可以很容易實(shí)現(xiàn)功能的擴(kuò)展,符合開閉原則。
模板方法模式
定義一個(gè)操作中算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變算法的結(jié)構(gòu)即可重定義該算法中的某些特定步驟。
模板方法模式是編程中經(jīng)常用到的模式,其非常簡(jiǎn)單,AbstractClass叫抽象模板,其方法分為3類:
1.抽象方法:父類中只聲明但不加以實(shí)現(xiàn),而是定義好規(guī)范,然后由它的子類去實(shí)現(xiàn)。
2.模版方法:由抽象類聲明并加以實(shí)現(xiàn)。一般來(lái)說(shuō),模版方法調(diào)用抽象方法來(lái)完成主要的邏輯功能,并且,模版方法大多會(huì)定義為final類型,指明主要的邏輯功能在子類中不能被重寫。
3.鉤子方法:由抽象類聲明并加以實(shí)現(xiàn)。但是子類可以去擴(kuò)展,子類可以通過(guò)擴(kuò)展鉤子方法來(lái)影響模版方法的邏輯。
實(shí)現(xiàn)類用來(lái)實(shí)現(xiàn)細(xì)節(jié)。抽象類中的模版方法正是通過(guò)實(shí)現(xiàn)類擴(kuò)展的方法來(lái)完成業(yè)務(wù)邏輯。
模板方法模式優(yōu)點(diǎn)1.容易擴(kuò)展。一般來(lái)說(shuō),抽象類中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過(guò)增加實(shí)現(xiàn)類一般可以很容易實(shí)現(xiàn)功能的擴(kuò)展,符合開閉原則。
2.便于維護(hù)。對(duì)于模版方法模式來(lái)說(shuō),正是由于他們的主要邏輯相同,才使用了模版方法。
適用場(chǎng)景在多個(gè)子類擁有相同的方法,并且這些方法邏輯相同時(shí),可以考慮使用模版方法模式。在程序的主框架相同,細(xì)節(jié)不同的場(chǎng)合下,也比較適合使用這種模式。
代碼//模板方法 var DP = require("./DesignPattern.js"); var AbstractCheck = (function () { _check = function () { this.startup(); this.speeup(); this.checkspeed(); this.brake(); this.stop(); } return function AbstractCheck() { DP.Interface(this, ["startup", "speeup", "brake", "stop"]); this.checkspeed = function () { console.log("默認(rèn)不檢測(cè)速度"); }; this.check = _check; } })(); function Porsche911() { this.__proto__ = new AbstractCheck(); this.startup = function () { console.log("檢測(cè)911啟動(dòng)"); }; this.speeup = function () { console.log("檢測(cè)911加速"); }; this.brake = function () { console.log("檢測(cè)911剎車"); //檢測(cè)方法標(biāo)準(zhǔn) console.log("911剎車合格"); }; this.stop = function () { console.log("檢測(cè)911熄火"); } } function Porsche781() { this.__proto__ = new AbstractCheck(); this.startup = function () { console.log("檢測(cè)781啟動(dòng)"); }; this.speeup = function () { console.log("檢測(cè)781加速"); }; this.brake = function () { console.log("檢測(cè)781剎車"); //檢測(cè)方法標(biāo)準(zhǔn) console.log("781剎車合格"); }; this.stop = function () { console.log("檢測(cè)781熄火"); }; this.checkspeed = function () { console.log("檢測(cè)781速度"); }; } var porsche911 = new Porsche911(); var porsche781 = new Porsche781(); porsche911.check(); porsche781.check();
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/79483.html
摘要:讓一切變得更簡(jiǎn)單抽象化深入封裝算法塊,這便是設(shè)計(jì)模式當(dāng)中的一種模式模板方法模式。定義模板方法模式在一個(gè)方法中定義一個(gè)算法的框架,而將一些步驟延遲到子類中。 讓一切變得更簡(jiǎn)單抽象化 深入封裝算法塊,這便是設(shè)計(jì)模式當(dāng)中的一種模式:模板方法模式。 我們先來(lái)看看下面兩個(gè)茶和咖啡配方showImg(https://segmentfault.com/img/bVV4kS?w=1248&h=...
摘要:面向?qū)ο笕筇卣骼^承性多態(tài)性封裝性接口。第五階段封裝一個(gè)屬于自己的框架框架封裝基礎(chǔ)事件流冒泡捕獲事件對(duì)象事件框架選擇框架。核心模塊和對(duì)象全局對(duì)象,,,事件驅(qū)動(dòng),事件發(fā)射器加密解密,路徑操作,序列化和反序列化文件流操作服務(wù)端與客戶端。 第一階段: HTML+CSS:HTML進(jìn)階、CSS進(jìn)階、div+css布局、HTML+css整站開發(fā)、 JavaScript基礎(chǔ):Js基礎(chǔ)教程、js內(nèi)置對(duì)...
摘要:面向?qū)ο笕筇卣骼^承性多態(tài)性封裝性接口。第五階段封裝一個(gè)屬于自己的框架框架封裝基礎(chǔ)事件流冒泡捕獲事件對(duì)象事件框架選擇框架。核心模塊和對(duì)象全局對(duì)象,,,事件驅(qū)動(dòng),事件發(fā)射器加密解密,路徑操作,序列化和反序列化文件流操作服務(wù)端與客戶端。 第一階段: HTML+CSS:HTML進(jìn)階、CSS進(jìn)階、div+css布局、HTML+css整站開發(fā)、 JavaScript基礎(chǔ):Js基礎(chǔ)教程、js內(nèi)置對(duì)...
摘要:本文首發(fā)于的技術(shù)博客實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。如果你使用了,或類似的,那么,通過(guò)編譯前后的代碼相差就很大了,這會(huì)造成兩個(gè)問(wèn)題以為例把你的代碼轉(zhuǎn)成什么樣你自己是無(wú)法控制的,這往往導(dǎo)致無(wú)法通過(guò)的審查。 本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/1190000007030775如果您...
閱讀 3042·2021-11-24 09:38
閱讀 3568·2021-11-23 09:51
閱讀 1126·2021-09-09 11:52
閱讀 4143·2021-08-11 11:18
閱讀 1187·2019-08-30 14:05
閱讀 3285·2019-08-30 11:23
閱讀 1842·2019-08-29 17:02
閱讀 1190·2019-08-26 13:49