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