javascript模板方法模式和職責鏈模式實例分析

    一、模板方法模式 1、模板方法模式,基于繼承的設計模式,由兩部分組成,抽象父類和具體實現(xiàn)子類。 2、例子Coffe 和 Tea //創(chuàng)建抽象類 -- 飲料 function Beverage(){} Beverage.prototype.boilWater

    一、模板方法模式

    1、模板方法模式,基于繼承的設計模式,由兩部分組成,抽象父類和具體實現(xiàn)子類。

    2、例子Coffe 和 Tea

    //創(chuàng)建抽象類 -- 飲料
         function Beverage(){}
         Beverage.prototype.boilWater = function(){
             console.log("把水煮沸")
         }
         //抽象的父類方法,具體實現(xiàn)由子類來寫
         Beverage.prototype.brew = function(){} //泡
         Beverage.prototype.pourIncup = function(){} //飲料倒進杯子
         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("把咖啡倒進杯子")
         }
         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("茶倒進杯子")
         }
         Tea.prototype.brew = function (){
             console.log("加檸檬")
         }
         var tea= new Tea();
         tea.init();

    Beverage.prototype.init 被稱為模板方法的原因是:該方法封裝了子類的算法框架,作為算法模板,指導子類以何種順序去執(zhí)行方法。

    ??抽象方法沒有具體的實現(xiàn)過程,是一些啞方法,當子類繼承這個抽象類,必須重寫父類的抽象方法。

    如果子類忘記實現(xiàn)父類中的抽象方法?

    Beverage.prototype.brew = function (){
        throw new Error("子類必須重寫父類的brew方法")
    }

    二、職責鏈模式

    1、職責鏈模式:弱化了發(fā)送(請求)-接收者之間的強聯(lián)系。

    2、購物付定金例子

     //舊版 order
            //orderType 預付定金類型,code為1 500元定金 code為2 200元定金 code為3 普通用戶
            //pay 是否已經(jīng)支付過定金
            //stock  當前用于普通購買客戶的手機內(nèi)存數(shù)量
            var order = function (orderType, pay, stock) {
                if (orderType === 1) {
                    if (pay) {
                        console.log("預付500定金并且已支付,得到100元優(yōu)惠券")
                    } else { //定金未支付,降到普通購買
                        if (stock > 0) {
                            console.log("普通購買,無優(yōu)惠券")
                        } else {
                            console.log("庫存不足");
                        }
                    }
                }
                if (orderType === 2) {
                    if (pay) {
                        console.log("預付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("庫存不足");
                    }
                }
            }
            //重構
            var order500 = function(orderType, pay, stock){
                if(orderType ===1 && pay){
                    console.log("預付500定金并且已支付,得到100元優(yōu)惠券")
                }else{
                    order200(orderType, pay, stock)
                }
            }
            var order500 = function(orderType, pay, stock){
                if(orderType ===1 && pay){
                    console.log("預付500定金并且已支付,得到100元優(yōu)惠券")
                }else{
                    order200(orderType, pay, stock)
                }
            }
            var order200 = function(orderType, pay, stock){
                if(orderType ===2 && pay){
                    console.log("預付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個小函數(shù),去掉了許多嵌套的條件分支語句。

    但是耦合嚴重,order500和order200耦合在一起,違反開放-封閉原則;

    更多設計模式相關知識點,還可以參考本站文章:

    https://www.jb51.net/article/252965.htm

    https://www.jb51.net/article/27973.htm

    聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結果,不保證100%準確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權益,可聯(lián)系我們進行處理。
    發(fā)表評論
    更多 網(wǎng)友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 国产情侣一区二区三区| 风间由美性色一区二区三区| 成人精品一区二区三区不卡免费看| 成人无码AV一区二区| 韩国精品福利一区二区三区| 精品黑人一区二区三区| 国产伦理一区二区| 精品国产免费一区二区三区| 国产日韩视频一区| 日韩一区二区超清视频| 日韩爆乳一区二区无码| 日韩人妻无码一区二区三区| 精品3d动漫视频一区在线观看| 97一区二区三区四区久久| 久久无码人妻一区二区三区| 亚洲AV综合色一区二区三区| 国产福利电影一区二区三区久久久久成人精品综合 | 国产在线一区二区| 天堂Aⅴ无码一区二区三区| 国产精品一区在线观看你懂的| 国产精品一区二区AV麻豆| 在线精品自拍亚洲第一区| 日本免费一区二区三区最新| 国产成人一区二区三区| 亚无码乱人伦一区二区| 国模视频一区二区| 视频一区在线播放| 成人午夜视频精品一区| 亚洲男人的天堂一区二区| 国产成人综合精品一区| 国产午夜精品一区理论片飘花| 国模吧一区二区三区| 麻豆文化传媒精品一区二区| 日韩国产免费一区二区三区| 无码少妇丰满熟妇一区二区| 国产伦一区二区三区免费| 成人午夜视频精品一区| 91在线看片一区国产| 最新中文字幕一区二区乱码| 动漫精品专区一区二区三区不卡| 亚洲人AV永久一区二区三区久久|