W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
模板方法(TemplateMethod)定義了一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
模板方法是一種代碼復(fù)用的基本技術(shù),在類庫中尤為重要,因為他們提取了類庫中的公共行為。模板方法導(dǎo)致一種反向的控制結(jié)構(gòu),這種結(jié)構(gòu)就是傳說中的“好萊塢法則”,即“別找找我們,我們找你”,這指的是父類調(diào)用一個類的操作,而不是相反。具體體現(xiàn)是面向?qū)ο缶幊叹幊陶Z言里的抽象類(以及其中的抽象方法),以及繼承該抽象類(和抽象方法)的子類。
舉個例子,泡茶和泡咖啡有同樣的步驟,比如燒開水(boilWater)、沖泡(brew)、倒在杯子里(pourOnCup),加小料(addCondiments)等等。但每種飲料沖泡的方法以及所加的小料不一樣,所以我們可以利用模板方法實現(xiàn)這個主要步驟。
首先先來定義抽象步驟:
var CaffeineBeverage = function () { }; CaffeineBeverage.prototype.prepareRecipe = function () { this.boilWater(); this.brew(); this.pourOnCup(); if (this.customerWantsCondiments()) { // 如果可以想加小料,就加上 this.addCondiments(); } }; CaffeineBeverage.prototype.boilWater = function () { console.log("將水燒開!"); }; CaffeineBeverage.prototype.pourOnCup = function () { console.log("將飲料到再杯子里!"); }; CaffeineBeverage.prototype.brew = function () { throw new Error("該方法必須重寫!"); }; CaffeineBeverage.prototype.addCondiments = function () { throw new Error("該方法必須重寫!"); }; // 默認(rèn)加上小料 CaffeineBeverage.prototype.customerWantsCondiments = function () { return true; };
該函數(shù)在原型上擴(kuò)展了所有的基礎(chǔ)步驟,以及主要步驟,沖泡和加小料步驟沒有實現(xiàn),供具體飲料所對應(yīng)的函數(shù)來實現(xiàn),另外是否加小料(customerWantsCondiments )默認(rèn)返回true,子函數(shù)重寫的時候可以重寫該值。
下面兩個函數(shù)分別是沖咖啡和沖茶所對應(yīng)的函數(shù):
// 沖咖啡 var Coffee = function () { CaffeineBeverage.apply(this); }; Coffee.prototype = new CaffeineBeverage(); Coffee.prototype.brew = function () { console.log("從咖啡機(jī)想咖啡倒進(jìn)去!"); }; Coffee.prototype.addCondiments = function () { console.log("添加糖和牛奶"); }; Coffee.prototype.customerWantsCondiments = function () { return confirm("你想添加糖和牛奶嗎?"); }; //沖茶葉 var Tea = function () { CaffeineBeverage.apply(this); }; Tea.prototype = new CaffeineBeverage(); Tea.prototype.brew = function () { console.log("泡茶葉!"); }; Tea.prototype.addCondiments = function () { console.log("添加檸檬!"); }; Tea.prototype.customerWantsCondiments = function () { return confirm("你想添加檸檬嘛?"); };
另外使用confirm,可以讓用戶自己選擇加不加小料,很不錯,不是嘛?
模板方法應(yīng)用于下列情況:
和策略模式不同,模板方法使用繼承來改變算法的一部分,而策略模式使用委托來改變整個算法。
參考:https://github.com/tcorral/Design-Patterns-in-Javascript/blob/master/Template/withHook/index.html
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: