最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解JavaScript系列(41):設(shè)計(jì)模式之模板方法詳解

 更新時(shí)間:2015年03月04日 09:40:43   投稿:junjie  
這篇文章主要介紹了深入理解JavaScript系列(41):設(shè)計(jì)模式之模板方法詳解,模板方法(TemplateMethod)定義了一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中,模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟,需要的朋友可以參考下

介紹

模板方法(TemplateMethod)定義了一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。

模板方法是一種代碼復(fù)用的基本技術(shù),在類(lèi)庫(kù)中尤為重要,因?yàn)樗麄兲崛×祟?lèi)庫(kù)中的公共行為。模板方法導(dǎo)致一種反向的控制結(jié)構(gòu),這種結(jié)構(gòu)就是傳說(shuō)中的“好萊塢法則”,即“別找找我們,我們找你”,這指的是父類(lèi)調(diào)用一個(gè)類(lèi)的操作,而不是相反。具體體現(xiàn)是面向?qū)ο缶幊叹幊陶Z(yǔ)言里的抽象類(lèi)(以及其中的抽象方法),以及繼承該抽象類(lèi)(和抽象方法)的子類(lèi)。

正文

舉個(gè)例子,泡茶和泡咖啡有同樣的步驟,比如燒開(kāi)水(boilWater)、沖泡(brew)、倒在杯子里(pourOnCup),加小料(addCondiments)等等。但每種飲料沖泡的方法以及所加的小料不一樣,所以我們可以利用模板方法實(shí)現(xiàn)這個(gè)主要步驟。

首先先來(lái)定義抽象步驟:

復(fù)制代碼 代碼如下:

var CaffeineBeverage = function () {

};
CaffeineBeverage.prototype.prepareRecipe = function () {
    this.boilWater();
    this.brew();
    this.pourOnCup();
    if (this.customerWantsCondiments()) {
        // 如果可以想加小料,就加上
 this.addCondiments();
    }
};
CaffeineBeverage.prototype.boilWater = function () {
    console.log("將水燒開(kāi)!");
};
CaffeineBeverage.prototype.pourOnCup = function () {
    console.log("將飲料到再杯子里!");
};
CaffeineBeverage.prototype.brew = function () {
    throw new Error("該方法必須重寫(xiě)!");
};
CaffeineBeverage.prototype.addCondiments = function () {
    throw new Error("該方法必須重寫(xiě)!");
};
// 默認(rèn)加上小料
CaffeineBeverage.prototype.customerWantsCondiments = function () {
    return true;
};

該函數(shù)在原型上擴(kuò)展了所有的基礎(chǔ)步驟,以及主要步驟,沖泡和加小料步驟沒(méi)有實(shí)現(xiàn),供具體飲料所對(duì)應(yīng)的函數(shù)來(lái)實(shí)現(xiàn),另外是否加小料(customerWantsCondiments )默認(rèn)返回true,子函數(shù)重寫(xiě)的時(shí)候可以重寫(xiě)該值。

下面兩個(gè)函數(shù)分別是沖咖啡和沖茶所對(duì)應(yīng)的函數(shù):

復(fù)制代碼 代碼如下:

// 沖咖啡
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,可以讓用戶(hù)自己選擇加不加小料,很不錯(cuò),不是嘛?

總結(jié)

模板方法應(yīng)用于下列情況:

1.一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類(lèi)來(lái)實(shí)現(xiàn)
2.各子類(lèi)中公共的行為應(yīng)被提取出來(lái)并集中到一個(gè)公共父類(lèi)中的避免代碼重復(fù),不同之處分離為新的操作,最后,用一個(gè)釣魚(yú)這些新操作的模板方法來(lái)替換這些不同的代碼
3.控制子類(lèi)擴(kuò)展,模板方法只在特定點(diǎn)調(diào)用“hook”操作,這樣就允許在這些點(diǎn)進(jìn)行擴(kuò)展

和策略模式不同,模板方法使用繼承來(lái)改變算法的一部分,而策略模式使用委托來(lái)改變整個(gè)算法。

相關(guān)文章

  • DOM基礎(chǔ)教程之模型中的模型節(jié)點(diǎn)

    DOM基礎(chǔ)教程之模型中的模型節(jié)點(diǎn)

    這篇文章主要介紹了DOM基礎(chǔ)教程之模型中的模型節(jié)點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2015-01-01
  • 輕松學(xué)習(xí)JavaScript函數(shù)中的 Rest 參數(shù)

    輕松學(xué)習(xí)JavaScript函數(shù)中的 Rest 參數(shù)

    ES6 引入 rest 參數(shù)用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對(duì)象了。rest 參數(shù)搭配的變量是一個(gè)數(shù)組,該變量將多余的參數(shù)放入數(shù)組中。下面我們來(lái)詳細(xì)了解一下吧
    2019-05-05
  • JavaScript DOM學(xué)習(xí)第一章 W3C DOM簡(jiǎn)介

    JavaScript DOM學(xué)習(xí)第一章 W3C DOM簡(jiǎn)介

    文檔對(duì)象模式(Document Object Model DOM)用來(lái)描述HTML頁(yè)面中那些輸入框、圖片、段落等等元素與最頂級(jí)的結(jié)構(gòu)document之間的關(guān)系。用適當(dāng)?shù)姆椒▉?lái)選取這些元素,我們就可以改變他們。
    2010-02-02
  • JavaScript函數(shù)模式詳解

    JavaScript函數(shù)模式詳解

    文章對(duì)javascript的四種函數(shù)模式進(jìn)行了詳細(xì)的解釋?zhuān)⒏缴鲜纠奖阈』锇閭兝斫獠?yīng)用,希望對(duì)大家能有所幫助。
    2014-11-11
  • 對(duì)xmlHttp對(duì)象的理解

    對(duì)xmlHttp對(duì)象的理解

    xmlHttp是一套在JavaScript腳本語(yǔ)言中通過(guò)Http協(xié)議傳送或者接收XML及其他數(shù)據(jù)的API。
    2011-01-01
  • JS如何刪除對(duì)象中的某一屬性(delete)

    JS如何刪除對(duì)象中的某一屬性(delete)

    這篇文章主要介紹了JS如何刪除對(duì)象中的某一屬性(delete),在這里需要注意已聲明的對(duì)象不可刪除, 對(duì)象中的對(duì)象屬性可以刪除,本文結(jié)合示例代碼給大家的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 對(duì)象轉(zhuǎn)換為原始值的實(shí)現(xiàn)方法

    對(duì)象轉(zhuǎn)換為原始值的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇對(duì)象轉(zhuǎn)換為原始值的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • 帶你快速理解javascript中的事件模型

    帶你快速理解javascript中的事件模型

    這篇文章主要介紹了javascript中的事件模型,其中包括了DOM0級(jí)事件模型和DOM2級(jí)事件模型(事件捕獲和事件冒泡和DOM2級(jí)的注冊(cè)事件和解除事件),需要的朋友可以參考下
    2017-08-08
  • javascript 實(shí)例詳解循環(huán)用法

    javascript 實(shí)例詳解循環(huán)用法

    假如您需要運(yùn)行代碼多次,且每次使用不同的值,那么循環(huán)(loop)相當(dāng)方便使用。本篇文章通過(guò)幾個(gè)實(shí)例來(lái)帶你掌握循環(huán)的用法
    2021-11-11
  • 你的 mixin 真的兼容 ECMAScript 5 嗎?

    你的 mixin 真的兼容 ECMAScript 5 嗎?

    本篇文章主要講述了,在JavaScript 中把一個(gè)對(duì)象的屬性或者方法 mixin 到另一個(gè)
    2013-04-04

最新評(píng)論

葫芦岛市| 凌海市| 尤溪县| 江安县| 沈阳市| 团风县| 清远市| 丹江口市| 库尔勒市| 岱山县| 盐城市| 平和县| 大兴区| 麻阳| 嘉鱼县| 遂昌县| 黄石市| 大名县| 小金县| 茌平县| 子长县| 崇仁县| 咸宁市| 原平市| 九龙城区| 米林县| 根河市| 云霄县| 恭城| 顺义区| 巴楚县| 策勒县| 蚌埠市| 胶州市| 交城县| 盖州市| 饶阳县| 桓仁| 湟中县| 宁明县| 丁青县|