javascript設(shè)計(jì)模式 – 模板方法模式原理與用法實(shí)例分析
本文實(shí)例講述了javascript設(shè)計(jì)模式 – 模板方法模式原理與用法。分享給大家供大家參考,具體如下:
介紹:模板方法模式是結(jié)構(gòu)最簡(jiǎn)單的行為型設(shè)計(jì)模式,在其結(jié)構(gòu)中只存在父類與子類之間的繼承關(guān)系。使用模板方法模式,可以將一些復(fù)雜流程的實(shí)現(xiàn)步驟封裝在一系列基本方法中。
定義:定義一個(gè)操作中算法的框架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。模板方法是一種類行為型模式。
場(chǎng)景:我們?cè)O(shè)計(jì)一個(gè)游戲機(jī),用來(lái)運(yùn)行不同的游戲,
示例:
var Game = function(){
this.play = function(){
this.initialize();
this.startPlay();
this.endPlay();
this.uninstall();
}
this.uninstall = function(){
console.log('uninstall Game')
}
}
var CrossFire = function(){
this.initialize = function(){
console.log('CrossFire initialize')
}
this.startPlay = function(){
console.log('CrossFire startPlay')
}
this.endPlay = function(){
console.log('CrossFire endPlay')
}
}
CrossFire.prototype = new Game();
var LeagueofLegends = function(){
this.initialize = function(){
console.log('LeagueofLegends initialize')
}
this.startPlay = function(){
console.log('LeagueofLegends startPlay')
}
this.endPlay = function(){
console.log('LeagueofLegends endPlay')
}
}
LeagueofLegends.prototype = new Game();
var cf = new CrossFire();
cf.play();
// CrossFire initialize
// CrossFire startPlay
// CrossFire endPlay
// uninstall Game
var lol = new LeagueofLegends();
lol.play();
// LeagueofLegends initialize
// LeagueofLegends startPlay
// LeagueofLegends endPlay
// uninstall Game
在這個(gè)例子里,Game稱為抽象類,抽象類內(nèi)部定義了一個(gè)模板方法play,play的內(nèi)部定義了算法的架構(gòu),算法的執(zhí)行順序,只有子類將步驟補(bǔ)齊后才能執(zhí)行模板方法。
LeagueofLegends,CrossFire這兩個(gè)類稱為子類,繼承自Game,他們的任務(wù)是實(shí)現(xiàn)模板方法中的步驟。
initialize,startPlay,endPlay,uninstall稱為基本方法,用來(lái)具體實(shí)現(xiàn)每個(gè)步驟
模板方法模式總結(jié):
優(yōu)點(diǎn):
* 模板方法模式是一種代碼復(fù)用技術(shù),將公共行為放在父類中,而通過其子類來(lái)實(shí)現(xiàn)不同的行為,他鼓勵(lì)恰當(dāng)使用繼承來(lái)實(shí)現(xiàn)代碼復(fù)用。
* 模板方法可以實(shí)現(xiàn)一種反向控制結(jié)構(gòu),通過子類覆蓋父類的方法來(lái)決定某一步驟是否執(zhí)行。
缺點(diǎn):
* 需要為每一個(gè)基本方法的不同實(shí)現(xiàn)提供一個(gè)子類,如果父類中可變的基本方法太多,將會(huì)導(dǎo)致類的個(gè)數(shù)增加,系統(tǒng)更加龐大。
適用場(chǎng)景:
* 對(duì)一些復(fù)雜的算法進(jìn)行分割,將其中固定不變的布馮設(shè)計(jì)為模板方法和父類基本方法,改變的細(xì)節(jié)由子類實(shí)現(xiàn)。
* 各子類的公共行為應(yīng)當(dāng)被提取出來(lái)并集中帶一個(gè)父類中,利于代碼復(fù)用。
* 需要子類決定父類的某個(gè)步驟是否執(zhí)行,實(shí)現(xiàn)子類對(duì)父類的反向控制。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript輸入框字?jǐn)?shù)實(shí)時(shí)統(tǒng)計(jì)更新
這篇文章主要介紹了JavaScript輸入框字?jǐn)?shù)實(shí)時(shí)統(tǒng)計(jì)更新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
JavaScript實(shí)現(xiàn)移動(dòng)端帶transition動(dòng)畫的輪播效果
這篇文章主要介紹了JavaScript原生實(shí)現(xiàn)帶transition動(dòng)畫的自動(dòng)+手動(dòng)輪播效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
網(wǎng)站頁(yè)面自動(dòng)跳轉(zhuǎn)實(shí)現(xiàn)方法PHP、JSP(上)
自動(dòng)轉(zhuǎn)向,也叫自動(dòng)重定向。自動(dòng)跳轉(zhuǎn),指當(dāng)訪問用戶登陸到某網(wǎng)站時(shí),自動(dòng)將用戶轉(zhuǎn)向其它網(wǎng)頁(yè)地址的一種技術(shù)。轉(zhuǎn)向的網(wǎng)頁(yè)地址可以是網(wǎng)站內(nèi)的其它網(wǎng)頁(yè),也可以是其它網(wǎng)站。2010-08-08
比較詳細(xì)的javascript DOM 學(xué)習(xí)筆記
看了很多的js dom學(xué)習(xí)資料,發(fā)現(xiàn)這個(gè)比較詳細(xì),特轉(zhuǎn)載給大家學(xué)習(xí)一下2008-06-06
js+canvas實(shí)現(xiàn)網(wǎng)站背景鼠標(biāo)吸附線條動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了js+canvas實(shí)現(xiàn)網(wǎng)站背景鼠標(biāo)吸附線條動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
詳解小程序如何改變onLoad的執(zhí)行時(shí)機(jī)
這篇文章主要介紹了詳解小程序如何改變onLoad的執(zhí)行時(shí)機(jī),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
document.documentElement的一些使用技巧
documentElement 屬性可返回文檔的根節(jié)點(diǎn),接下來(lái)為大家詳細(xì)介紹下document.documentElement的一些使用技巧,感興趣的朋友可以參考下哈2013-04-04

