欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript模板方法模式和職責(zé)鏈模式實(shí)例分析

 更新時(shí)間:2023年07月12日 08:43:49   作者:flying_huixia  
這篇文章主要介紹了javascript模板方法模式和職責(zé)鏈模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了模板方法模式和職責(zé)鏈模式基本原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下

一、模板方法模式

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

相關(guān)文章

  • 詳細(xì)聊聊對async/await的理解和用法

    詳細(xì)聊聊對async/await的理解和用法

    隨著Nodev7的發(fā)布,越來越多的人開始研究據(jù)說是異步編程終級解決方案的 async/await,這篇文章主要給大家介紹了關(guān)于對async/await的理解和用法,文中通過實(shí)例代碼介紹的介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • JavaScript oncopy事件用法實(shí)例解析

    JavaScript oncopy事件用法實(shí)例解析

    這篇文章主要介紹了JavaScript oncopy事件用法實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • javascript+css實(shí)現(xiàn)俄羅斯方塊小游戲

    javascript+css實(shí)現(xiàn)俄羅斯方塊小游戲

    這篇文章主要為大家詳細(xì)介紹了javascript+css實(shí)現(xiàn)俄羅斯方塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 詳解js中call與apply關(guān)鍵字的作用

    詳解js中call與apply關(guān)鍵字的作用

    本文主要介紹js中call與apply關(guān)鍵字的作用以及它們的用法,具體實(shí)例如下,希望對大家有所幫助
    2016-11-11
  • 提供復(fù)制本站內(nèi)容時(shí)出現(xiàn),該文章轉(zhuǎn)自腳本之家等字樣的js代碼

    提供復(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ù)

    本文主要介紹了利用JS輕松實(shí)現(xiàn)獲取表單數(shù)據(jù)。方法有別于原始的做法,大家可以試著找原始做法與本文所說方法之間的區(qū)別。有興趣的朋友可以看下,希望對大家有所幫助
    2016-12-12
  • js提示信息jtip封裝代碼,可以是圖片或文章

    js提示信息jtip封裝代碼,可以是圖片或文章

    今天是相當(dāng)?shù)睦?,所以就點(diǎn)比較容易點(diǎn)的東西吧,講關(guān)于鼠標(biāo)移動(dòng)后出現(xiàn)提示信息的js代碼。能力有限,寫得不好盡管提出來。
    2010-01-01
  • JavaScript雙問號(??)操作符用法詳解

    JavaScript雙問號(??)操作符用法詳解

    在現(xiàn)代JavaScript開發(fā)中,處理變量默認(rèn)值是一個(gè)常見但容易引發(fā)bug的操作,很多開發(fā)者可能都遇到過這樣的問題:使用||設(shè)置默認(rèn)值時(shí),意外覆蓋了0、''等合法值,這時(shí)候,ES2020引入的雙問號操作符(??)就能完美解決這類問題,本文將帶您全面掌握這個(gè)操作符的使用場景和高級技巧
    2025-04-04
  • 用JavaScript實(shí)現(xiàn)讓瀏覽器停止載入頁面的方法

    用JavaScript實(shí)現(xiàn)讓瀏覽器停止載入頁面的方法

    下面小編就為大家?guī)硪黄肑avaScript實(shí)現(xiàn)讓瀏覽器停止載入頁面的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • JS+html5實(shí)現(xiàn)異步上傳圖片顯示上傳文件進(jìn)度條功能示例

    JS+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

最新評論