javascript模板方法模式和職責(zé)鏈模式實(shí)例分析
一、模板方法模式
1、模板方法模式,基于繼承的設(shè)計(jì)模式,由兩部分組成,抽象父類和具體實(shí)現(xiàn)子類。
2、例子Coffe 和 Tea
//創(chuàng)建抽象類 -- 飲料 function Beverage(){} Beverage.prototype.boilWater = function(){ console.log("把水煮沸") } //抽象的父類方法,具體實(shí)現(xiàn)由子類來寫 Beverage.prototype.brew = function(){} //泡 Beverage.prototype.pourIncup = function(){} //飲料倒進(jìn)杯子 Beverage.prototype.addCond = function(){} //加調(diào)料 Beverage.prototype.init = function(){ this.boilWater(); this.brew(); this.pourIncup(); this.addCond(); } //創(chuàng)建具體子類 coffee and tea var Coffee = function (){}; Coffee.prototype = new Beverage(); Coffee.prototype.brew = function (){ console.log("用沸水沖泡咖啡") } Coffee.prototype.brew = function (){ console.log("把咖啡倒進(jìn)杯子") } Coffee.prototype.brew = function (){ console.log("加糖和牛奶") } var coffee = new Coffee(); coffee.init(); var Tea = function(){}; Tea.prototype = new Beverage(); Tea.prototype.brew = function (){ console.log("用沸水沖泡茶") } Tea.prototype.brew = function (){ console.log("茶倒進(jìn)杯子") } Tea.prototype.brew = function (){ console.log("加檸檬") } var tea= new Tea(); tea.init();
Beverage.prototype.init
被稱為模板方法的原因是:該方法封裝了子類的算法框架,作為算法模板,指導(dǎo)子類以何種順序去執(zhí)行方法。
??抽象方法沒有具體的實(shí)現(xiàn)過程,是一些啞方法,當(dāng)子類繼承這個(gè)抽象類,必須重寫父類的抽象方法。
如果子類忘記實(shí)現(xiàn)父類中的抽象方法?
Beverage.prototype.brew = function (){ throw new Error("子類必須重寫父類的brew方法") }
二、職責(zé)鏈模式
1、職責(zé)鏈模式:弱化了發(fā)送(請求)-接收者之間的強(qiáng)聯(lián)系。
2、購物付定金例子
//舊版 order //orderType 預(yù)付定金類型,code為1 500元定金 code為2 200元定金 code為3 普通用戶 //pay 是否已經(jīng)支付過定金 //stock 當(dāng)前用于普通購買客戶的手機(jī)內(nèi)存數(shù)量 var order = function (orderType, pay, stock) { if (orderType === 1) { if (pay) { console.log("預(yù)付500定金并且已支付,得到100元優(yōu)惠券") } else { //定金未支付,降到普通購買 if (stock > 0) { console.log("普通購買,無優(yōu)惠券") } else { console.log("庫存不足"); } } } if (orderType === 2) { if (pay) { console.log("預(yù)付200定金并且已支付,得到50元優(yōu)惠券") } else { //定金未支付,降到普通購買 if (stock > 0) { console.log("普通購買,無優(yōu)惠券") } else { console.log("庫存不足"); } } } if (orderType === 3) { if (stock > 0) { console.log("普通購買,無優(yōu)惠券") } else { console.log("庫存不足"); } } } //重構(gòu) var order500 = function(orderType, pay, stock){ if(orderType ===1 && pay){ console.log("預(yù)付500定金并且已支付,得到100元優(yōu)惠券") }else{ order200(orderType, pay, stock) } } var order500 = function(orderType, pay, stock){ if(orderType ===1 && pay){ console.log("預(yù)付500定金并且已支付,得到100元優(yōu)惠券") }else{ order200(orderType, pay, stock) } } var order200 = function(orderType, pay, stock){ if(orderType ===2 && pay){ console.log("預(yù)付200定金并且已支付,得到50元優(yōu)惠券") }else{ orderNormal(orderType, pay, stock) } } var orderNormal = function(orderType, pay, stock){ if (stock > 0) { console.log("普通購買,無優(yōu)惠券") } else { console.log("庫存不足"); } }
大函數(shù)拆分成3個(gè)小函數(shù),去掉了許多嵌套的條件分支語句。
但是耦合嚴(yán)重,order500和order200耦合在一起,違反開放-封閉原則;
更多設(shè)計(jì)模式相關(guān)知識點(diǎn),還可以參考本站文章:
http://www.dbjr.com.cn/article/252965.htm
http://www.dbjr.com.cn/article/27973.htm
- JavaScript設(shè)計(jì)模式之責(zé)任鏈模式實(shí)例分析
- JS設(shè)計(jì)模式之責(zé)任鏈模式實(shí)例詳解
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之責(zé)任鏈模式
- javascript設(shè)計(jì)模式 – 模板方法模式原理與用法實(shí)例分析
- JavaScript設(shè)計(jì)模式之模板方法模式原理與用法示例
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之模板方法模式
- JavaScript 設(shè)計(jì)模式 安全沙箱模式
- JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布者-訂閱者模式)
- javascript設(shè)計(jì)模式之解釋器模式詳解
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式(鏈?zhǔn)秸{(diào)用)
- JavaScript 設(shè)計(jì)模式之組合模式解析
相關(guān)文章
JavaScript oncopy事件用法實(shí)例解析
這篇文章主要介紹了JavaScript oncopy事件用法實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05javascript+css實(shí)現(xiàn)俄羅斯方塊小游戲
這篇文章主要為大家詳細(xì)介紹了javascript+css實(shí)現(xiàn)俄羅斯方塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06提供復(fù)制本站內(nèi)容時(shí)出現(xiàn),該文章轉(zhuǎn)自腳本之家等字樣的js代碼
提供復(fù)制本站內(nèi)容時(shí)出現(xiàn),該文章轉(zhuǎn)自腳本之家等字樣的js代碼...2007-03-03利用JS輕松實(shí)現(xiàn)獲取表單數(shù)據(jù)
本文主要介紹了利用JS輕松實(shí)現(xiàn)獲取表單數(shù)據(jù)。方法有別于原始的做法,大家可以試著找原始做法與本文所說方法之間的區(qū)別。有興趣的朋友可以看下,希望對大家有所幫助2016-12-12用JavaScript實(shí)現(xiàn)讓瀏覽器停止載入頁面的方法
下面小編就為大家?guī)硪黄肑avaScript實(shí)現(xiàn)讓瀏覽器停止載入頁面的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01JS+html5實(shí)現(xiàn)異步上傳圖片顯示上傳文件進(jìn)度條功能示例
這篇文章主要介紹了JS+html5實(shí)現(xiàn)異步上傳圖片顯示上傳文件進(jìn)度條功能,結(jié)合完整實(shí)例形式分析了JavaScript前端結(jié)合HTML5實(shí)現(xiàn)post文件上傳與進(jìn)度條顯示相關(guān)操作技巧,需要的朋友可以參考下2019-11-11