學(xué)習(xí)JavaScript設(shè)計模式之模板方法模式
一、定義
模板方法是基于繼承的設(shè)計模式,可以很好的提高系統(tǒng)的擴展性。 java中的抽象父類、子類
模板方法有兩部分結(jié)構(gòu)組成,第一部分是抽象父類,第二部分是具體的實現(xiàn)子類。
二、示例
Coffee or Tea
(1) 把水煮沸
(2) 用沸水浸泡茶葉
(3) 把茶水倒進杯子
(4) 加檸檬
/* 抽象父類:飲料 */ var Beverage = function(){}; // (1) 把水煮沸 Beverage.prototype.boilWater = function() { console.log("把水煮沸"); }; // (2) 沸水浸泡 Beverage.prototype.brew = function() { throw new Error("子類必須重寫brew方法"); }; // (3) 倒進杯子 Beverage.prototype.pourInCup = function() { throw new Error("子類必須重寫pourInCup方法"); }; // (4) 加調(diào)料 Beverage.prototype.addCondiments = function() { throw new Error("子類必須重寫addCondiments方法"); }; /* 模板方法 */ Beverage.prototype.init = function() { this.boilWater(); this.brew(); this.pourInCup(); this.addCondiments(); } /* 實現(xiàn)子類 Coffee*/ var Coffee = function(){}; Coffee.prototype = new Beverage(); // 重寫非公有方法 Coffee.prototype.brew = function() { console.log("用沸水沖泡咖啡"); }; Coffee.prototype.pourInCup = function() { console.log("把咖啡倒進杯子"); }; Coffee.prototype.addCondiments = function() { console.log("加牛奶"); }; var coffee = new Coffee(); coffee.init();
通過模板方法模式,在父類中封裝了子類的算法框架。這些算法框架在正常狀態(tài)下是適用大多數(shù)子類的,但也會出現(xiàn)“個性”子類。
如上述流程,加調(diào)料是可選的。
鉤子方法可以解決這個問題,放置鉤子是隔離變化的一種常見手段。
/* 添加鉤子方法 */ Beverage.prototype.customerWantsCondiments = function() { return true; }; Beverage.prototype.init = function() { this.boilWater(); this.brew(); this.pourInCup(); if(this.customerWantsCondiments()) { this.addCondiments(); } } /* 實現(xiàn)子類 Tea*/ var Tea = function(){}; Tea.prototype = new Beverage(); // 重寫非公有方法 Tea.prototype.brew = function() { console.log("用沸水沖泡茶"); }; Tea.prototype.pourInCup = function() { console.log("把茶倒進杯子"); }; Tea.prototype.addCondiments = function() { console.log("加牛奶"); }; Tea.prototype.customerWantsCondiments = function() { return window.confirm("需要添加調(diào)料嗎?"); }; var tea = new Tea(); tea.init();
JavaScript沒有提供真正的類式繼承,繼承是通過對象與對象之間的委托來實現(xiàn)的。
三、“好萊塢原則”:別調(diào)用我們,我們會調(diào)用你
典型使用場景:
(1)模板方法模式:使用該設(shè)計模式意味著子類放棄了對自己的控制權(quán),而是改為父類通知子類。作為子類,只負(fù)責(zé)提供一些設(shè)計上的細(xì)節(jié)。
(2)觀察者模式:發(fā)布者把消息推送給訂閱者。
(3)回調(diào)函數(shù):ajax異步請求,把需要執(zhí)行的操作封裝在回調(diào)函數(shù)里,當(dāng)數(shù)據(jù)返回后,這個回調(diào)函數(shù)才被執(zhí)行。
希望本文所述對大家學(xué)習(xí)javascript程序設(shè)計有所幫助。
- JavaScript設(shè)計模式之模板方法模式原理與用法示例
- javascript設(shè)計模式 – 觀察者模式原理與用法實例分析
- javascript設(shè)計模式 – 狀態(tài)模式原理與用法實例分析
- javascript設(shè)計模式 – 策略模式原理與用法實例分析
- javascript設(shè)計模式 – 備忘錄模式原理與用法實例分析
- javascript設(shè)計模式 – 中介者模式原理與用法實例分析
- javascript設(shè)計模式 – 命令模式原理與用法實例分析
- javascript設(shè)計模式 – 解釋器模式原理與用法實例分析
- javascript設(shè)計模式 – 迭代器模式原理與用法實例分析
- javascript設(shè)計模式 – 裝飾模式原理與應(yīng)用實例分析
- javascript設(shè)計模式 – 組合模式原理與應(yīng)用實例分析
- javascript設(shè)計模式 – 模板方法模式原理與用法實例分析
相關(guān)文章
關(guān)于javaScript注冊click事件傳遞參數(shù)的不成功問題
在javaScript中給一個html元素注冊click事件處理函數(shù)時,比如給該處理函數(shù)傳3個參數(shù)??墒遣还苁鞘褂孟旅婺欠N方式都不能給事件處理函數(shù)傳遞參數(shù)2014-07-07javascript十六進制數(shù)字和ASCII字符之間的轉(zhuǎn)換方法
下面小編就為大家?guī)硪黄猨avascript十六進制數(shù)字和ASCII字符之間的轉(zhuǎn)換方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12