中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

總結(jié)JavaScript設(shè)計模式編程中的享元模式使用
來源:易賢網(wǎng) 閱讀:899 次 日期:2016-06-25 14:14:50
溫馨提示:易賢網(wǎng)小編為您整理了“總結(jié)JavaScript設(shè)計模式編程中的享元模式使用”,方便廣大網(wǎng)友查閱!

享元模式不同于一般的設(shè)計模式,它主要用來優(yōu)化程序的性能,它最適合解決大量類似的對象而產(chǎn)生的性能問題。享元模式通過分析應(yīng)用程序的對象,將其解析為內(nèi)在數(shù)據(jù)和外在數(shù)據(jù),減少對象的數(shù)量,從而提高應(yīng)用程序的性能。

基本知識

享元模式通過共享大量的細(xì)粒度的對象,減少對象的數(shù)量,從而減少對象的內(nèi)存,提高應(yīng)用程序的性能。其基本思想就是分解現(xiàn)有類似對象的組成,將其展開為可以共享的內(nèi)在數(shù)據(jù)和不可共享的外在數(shù)據(jù),我們稱內(nèi)在數(shù)據(jù)的對象為享元對象。通常還需要一個工廠類來維護(hù)內(nèi)在數(shù)據(jù)。

在JS中,享元模式主要有下面幾個角色組成:

(1)客戶端:用來調(diào)用享元工廠來獲取內(nèi)在數(shù)據(jù)的類,通常是應(yīng)用程序所需的對象,

(2)享元工廠:用來維護(hù)享元數(shù)據(jù)的類

(3)享元類:保持內(nèi)在數(shù)據(jù)的類

享元模式的實現(xiàn)和應(yīng)用

一般實現(xiàn)

我們舉個例子進(jìn)行說明:蘋果公司批量生產(chǎn)iphone,iphone的大部分?jǐn)?shù)據(jù)比如型號,屏幕都是一樣,少數(shù)部分?jǐn)?shù)據(jù)比如內(nèi)存有分16G,32G等。未使用享元模式前,我們寫代碼如下:

function Iphone(model, screen, memory, SN) {

  this. model = model;

  this.screen = screen;

  this.memory = memory;

  this.SN = SN;

}

var phones = [];

for (var i = 0; i < 1000000; i++) {

  var memory = i % 2 == 0 ? 16 : 32;

  phones.push(new Iphone("iphone6s", 5.0, memory, i));

}

這段代碼中,創(chuàng)建了一百萬個iphone,每個iphone都獨立申請一個內(nèi)存。但是我們仔細(xì)觀察可以看到,大部分iphone都是類似的,只是內(nèi)存和序列號不一樣,如果是一個對性能要求比較高的程序,我們就要考慮去優(yōu)化它。

大量相似對象的程序,我們就可以考慮用享元模式去優(yōu)化它,我們分析出大部分的iphone的型號,屏幕,內(nèi)存都是一樣的,那這部分?jǐn)?shù)據(jù)就可以公用,就是享元模式中的內(nèi)在數(shù)據(jù),定義享元類如下:

function IphoneFlyweight(model, screen, memory) {

  this.model = model;

  this.screen = screen;

  this.memory = memory;

}

我們定義了iphone的享元類,其中包含型號,屏幕和內(nèi)存三個數(shù)據(jù)。我們還需要一個享元工廠來維護(hù)這些數(shù)據(jù):

var flyweightFactory = (function () {

  var iphones = {};

  return {

    get: function (model, screen, memory) {

      var key = model + screen + memory;

      if (!iphones[key]) {

        iphones[key] = new IphoneFlyweight(model, screen, memory);

      }

      return iphones[key];

    }

  };

})();

在這個工廠中,我們定義了一個字典來保存享元對象,提供一個方法根據(jù)參數(shù)來獲取享元對象,如果字典中有則直接返回,沒有則創(chuàng)建一個返回。

接著我們創(chuàng)建一個客戶端類,這個客戶端類就是修改自iphone類:

function Iphone(model, screen, memory, SN) {

  this.flyweight = flyweightFactory.get(model, screen, memory);

  this.SN = SN;

}

然后我們依舊像之間那樣生成多個iphone

var phones = [];

for (var i = 0; i < 1000000; i++) {

  var memory = i % 2 == 0 ? 16 : 32;

  phones.push(new Iphone("iphone6s", 5.0, memory, i));

}

console.log(phones);

這里的關(guān)鍵就在于Iphone構(gòu)造函數(shù)里面的this.flyweight = flyweightFactory.get(model, screen, memory)。這句代碼通過享元工廠去獲取享元數(shù)據(jù),而在享元工廠里面,如果已經(jīng)存在相同數(shù)據(jù)的對象則會直接返回對象,多個iphone對象共享這部分相同的數(shù)據(jù),所以原本類似的數(shù)據(jù)已經(jīng)大大減少,減少的內(nèi)存的占用。

享元模式在DOM中的應(yīng)用

享元模式的一個典型應(yīng)用就是DOM事件操作,DOM事件機制分成事件冒泡和事件捕獲。我們簡單介紹一下這兩者:

事件冒泡:綁定的事件從最里層的元素開始觸發(fā),然后冒泡到最外層

事件捕獲:綁定的事件從最外層的元素開始觸發(fā),然后傳到最里層

假設(shè)我們HTML中有一個菜單列表

<ul class="menu">

  <li class="item">選項1</li>

  <li class="item">選項2</li>

  <li class="item">選項3</li>

  <li class="item">選項4</li>

  <li class="item">選項5</li>

  <li class="item">選項6</li>

</ul>

點擊菜單項,進(jìn)行相應(yīng)的操作,我們通過jQuery來綁定事件,一般會這么做:

$(".item").on("click", function () {

  console.log($(this).text());

})

給每個列表項綁定事件,點擊輸出相應(yīng)的文本。這樣看暫時沒有什么問題,但是如果是一個很長的列表,尤其是在移動端特別長的列表時,就會有性能問題,因為每個項都綁定了事件,都占用了內(nèi)存。但是這些事件處理程序其實都是很類似的,我們就要對其優(yōu)化。

$(".menu").on("click", ".item", function () {

  console.log($(this).text());

})

通過這種方式進(jìn)行事件綁定,可以減少事件處理程序的數(shù)量,這種方式叫做事件委托,也是運用了享元模式的原理。事件處理程序是公用的內(nèi)在部分,每個菜單項各自的文本就是外在部分。我們簡單說下事件委托的原理:點擊菜單項,事件會從li元素冒泡到ul元素,我們綁定事件到ul上,實際上就綁定了一個事件,然后通過事件參數(shù)event里面的target來判斷點擊的具體是哪一個元素,比如低級第一個li元素,event.target就是li,這樣就能拿到具體的點擊元素了,就可以根據(jù)不同元素進(jìn)行不同的處理。

總結(jié)

享元模式是一種優(yōu)化程序性能的手段,通過共享公用數(shù)據(jù)來減少對象數(shù)量以達(dá)到優(yōu)化程序的手段。享元模式適用于擁有大量類似對象并且對性能有要求的場景。因為享元模式需要分離內(nèi)部和外部數(shù)據(jù),增加了程序的邏輯復(fù)雜性,建議對性能有要求的時候才使用享元模式。

享元模式之利:

可以把網(wǎng)頁的資源符合降低幾個數(shù)量級。即使享元模式的應(yīng)用無法將實例的個數(shù)削減到一個,你仍能夠從中獲益不少。

這種節(jié)省不需要大量修改原有代碼。在創(chuàng)建了管理器、工廠和享元之后,就需要對代碼進(jìn)行的修改只不過是從直接實例化目標(biāo)類改為調(diào)用管理器對象的某個方法。

享元模式之弊:

如果把它用在不必要的地方,其結(jié)果反而有損代碼的運行效率。這種模式在優(yōu)化代碼的同時,也提高了其復(fù)雜程度,這會給調(diào)試和維護(hù)造成困難。

它之所以會妨礙調(diào)試,是因為現(xiàn)在可能出錯的地方變成了三個:管理器、工廠和享元。

這種優(yōu)化也會使維護(hù)變得更加困難。現(xiàn)在你面對的不是由封裝著數(shù)據(jù)的對象構(gòu)成的清晰架構(gòu),而是一堆又碎又亂的東西。其中的數(shù)據(jù)至少分兩處保存。最好注釋標(biāo)明內(nèi)在數(shù)據(jù)和外在數(shù)據(jù)。

只有在必要的時候才應(yīng)該進(jìn)行這種優(yōu)化。必須在運行效率和可維護(hù)性之間進(jìn)行權(quán)衡。如果拿不準(zhǔn)是否需要使用享元模式,那么你很可能并不需要它。享元模式適合的是系統(tǒng)資源已經(jīng)用得差不多而且明顯需要進(jìn)行某種優(yōu)化這樣一類場合。

這種模式對Javascript程序員特別有用,因為它可以用來減少網(wǎng)頁上所要使用的DOM元素的數(shù)量,要知道這些元素需要耗費許多內(nèi)存。結(jié)合使用這種模式與組合模式等組織型可以開發(fā)出功能豐富的復(fù)雜Web應(yīng)用系統(tǒng),它們可以平穩(wěn)的運行在任何現(xiàn)代Javascript環(huán)境中。

享元模式的適用場合:

網(wǎng)頁中必須使用了大量資源密集型對象。如果只會用到少許這類對象,這種優(yōu)化并不劃算。

對象中所保存的數(shù)據(jù)至少有一部分能被轉(zhuǎn)化為外在數(shù)據(jù)。此外,將這些數(shù)據(jù)存儲在對象外部所占用的資源應(yīng)該相對較少,否則這種做法對于性能的提示實際上毫無意義。那種大量包含基礎(chǔ)性代碼和HTML內(nèi)容的對象可能比較適合這種優(yōu)化。

將外在數(shù)據(jù)分離出去后,獨一無二的對象的數(shù)目相對較少。

更多信息請查看網(wǎng)絡(luò)編程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美伦理视频网站| 亚洲高清不卡av| 国产精品www.| 亚洲国产成人午夜在线一区| 亚洲一区三区电影在线观看| 欧美成人情趣视频| 国内久久精品视频| 午夜精品久久一牛影视| 欧美日韩专区| 中文在线资源观看网站视频免费不卡 | 国产精品无码永久免费888| 亚洲国产一区二区三区青草影视 | 欧美chengren| 一区二区亚洲精品| 久久免费的精品国产v∧| 海角社区69精品视频| 欧美在线视频免费播放| 国产精品免费网站| 亚洲专区一二三| 国产麻豆午夜三级精品| 午夜精品久久久久久久| 国产精品欧美日韩一区二区| 亚洲一区二区三区免费在线观看| 欧美日韩少妇| 午夜精品美女久久久久av福利| 国产精品福利在线观看| 亚洲无线一线二线三线区别av| 欧美午夜精品久久久久久人妖| 亚洲一区三区电影在线观看| 国产精品美女久久久浪潮软件| 午夜精品www| 国产一区二区三区最好精华液| 久久美女性网| 91久久精品国产91性色tv| 欧美另类在线播放| 宅男噜噜噜66一区二区66| 久久亚洲二区| 亚洲精选视频免费看| 欧美视频中文字幕在线| 欧美伊人久久大香线蕉综合69| 国产一级揄自揄精品视频| 免费不卡在线观看av| 99ri日韩精品视频| 国产精品露脸自拍| 久久久久久9999| 日韩一二三区视频| 国产欧美精品久久| 美女精品在线| 亚洲一区二区三区成人在线视频精品| 国产一区二区成人| 欧美肥婆在线| 先锋a资源在线看亚洲| 极品中文字幕一区| 久久尤物视频| 宅男精品视频| 影音先锋久久久| 欧美三级视频在线播放| 欧美制服第一页| 日韩亚洲欧美成人一区| 国产香蕉97碰碰久久人人| 欧美激情亚洲精品| 性欧美xxxx视频在线观看| 亚洲三级国产| 国产一级久久| 欧美午夜一区二区三区免费大片| 久久久久久69| 亚洲一区bb| 亚洲福利在线观看| 国产日韩精品综合网站| 欧美精品色一区二区三区| 欧美专区在线| 亚洲午夜一二三区视频| 亚洲国产精品福利| 国产一区二区久久精品| 欧美视频在线不卡| 欧美电影免费观看大全| 久久国产精品高清| 亚洲一品av免费观看| 亚洲精品视频中文字幕| 激情欧美丁香| 国产欧美一区二区精品性| 欧美日韩一区二区三区在线观看免| 久久精品成人| 欧美一区二区| 亚洲午夜羞羞片| 亚洲巨乳在线| 亚洲国产精品久久91精品| 国内成+人亚洲+欧美+综合在线| 欧美日韩在线不卡一区| 狂野欧美一区| 久久精品国产一区二区三区| 亚洲欧美成人一区二区在线电影 | 欧美日韩亚洲国产一区| 久久综合影音| 久久精品国产欧美亚洲人人爽| 亚洲一区二区三区精品在线观看| 亚洲精品中文字幕有码专区| 在线观看欧美视频| 好男人免费精品视频| 国产日本欧美视频| 国产美女扒开尿口久久久| 欧美午夜激情视频| 欧美日韩国产片| 欧美日本亚洲| 欧美日韩你懂的| 欧美人成在线视频| 欧美激情在线观看| 欧美国产日韩一区| 欧美激情视频网站| 欧美精品久久久久久| 欧美激情成人在线| 欧美夫妇交换俱乐部在线观看| 亚洲一区二区三区欧美| 亚洲欧美日本在线| 午夜亚洲福利| 欧美一区二区三区四区视频| 香蕉av777xxx色综合一区| 欧美一区二区视频在线| 午夜精品久久久久久99热| 先锋影音网一区二区| 久久精品青青大伊人av| 久久青草福利网站| 欧美成人性生活| 欧美日韩国产在线看| 国产精品久久久对白| 国产午夜精品久久| 在线成人小视频| 亚洲三级影院| 亚洲一区www| 久久精品国产免费观看| 欧美成人免费网| 欧美色综合天天久久综合精品| 国产精品少妇自拍| 精东粉嫩av免费一区二区三区| 亚洲国产中文字幕在线观看| 亚洲最新合集| 久久激情视频| 欧美连裤袜在线视频| 国产精品视频网| 在线精品国产成人综合| 一本一本久久a久久精品综合麻豆| 亚洲一区亚洲二区| 久久免费视频观看| 欧美日韩精品欧美日韩精品| 国产欧美精品日韩区二区麻豆天美| 狠狠色狠狠色综合日日五| 亚洲精品综合| 久久久久久久久综合| 欧美日韩伦理在线免费| 国产一区二区三区视频在线观看| 亚洲精品欧美精品| 午夜精品亚洲| 欧美国产亚洲另类动漫| 国产精品一区=区| 亚洲人成高清| 欧美在线一级视频| 欧美精品三级日韩久久| 国产精品综合网站| 亚洲激情视频在线观看| 欧美一区二区三区在线视频| 欧美激情一二区| 国产日韩视频| 日韩视频专区| 欧美一区日韩一区| 欧美a一区二区| 国产精品日韩一区二区| 亚洲国产乱码最新视频| 午夜亚洲伦理| 午夜电影亚洲| 欧美成人69av| 狠狠88综合久久久久综合网| 亚洲精品视频一区二区三区| 亚洲女优在线| 欧美三区美女| 激情久久五月| 午夜免费日韩视频| 欧美成人免费网| 亚洲第一综合天堂另类专| 欧美一区二区三区视频在线观看| 欧美jizz19性欧美| 国一区二区在线观看| 一区二区毛片| 欧美日本高清| 狠狠色综合播放一区二区| 亚洲欧美在线x视频| 久久手机免费观看| 国产精品久久久久久亚洲毛片| 亚洲精品欧美精品| 性色av一区二区三区红粉影视| 欧美视频在线观看一区| 影音先锋在线一区| 久久久青草婷婷精品综合日韩| 欧美成人乱码一区二区三区| 一色屋精品视频在线观看网站| 久久不射中文字幕| 国产精品第13页| 亚洲一区免费| 欧美精品在线视频| 亚洲精品日韩在线| 欧美在线资源|