亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

總結JavaScript設計模式編程中的享元模式使用

2019-11-20 09:58:41
字體:
來源:轉載
供稿:網友

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

基本知識

享元模式通過共享大量的細粒度的對象,減少對象的數量,從而減少對象的內存,提高應用程序的性能。其基本思想就是分解現有類似對象的組成,將其展開為可以共享的內在數據和不可共享的外在數據,我們稱內在數據的對象為享元對象。通常還需要一個工廠類來維護內在數據。
在JS中,享元模式主要有下面幾個角色組成:
(1)客戶端:用來調用享元工廠來獲取內在數據的類,通常是應用程序所需的對象,
(2)享元工廠:用來維護享元數據的類
(3)享元類:保持內在數據的類

享元模式的實現和應用

一般實現

我們舉個例子進行說明:蘋果公司批量生產iphone,iphone的大部分數據比如型號,屏幕都是一樣,少數部分數據比如內存有分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));}

這段代碼中,創建了一百萬個iphone,每個iphone都獨立申請一個內存。但是我們仔細觀察可以看到,大部分iphone都是類似的,只是內存和序列號不一樣,如果是一個對性能要求比較高的程序,我們就要考慮去優化它。
大量相似對象的程序,我們就可以考慮用享元模式去優化它,我們分析出大部分的iphone的型號,屏幕,內存都是一樣的,那這部分數據就可以公用,就是享元模式中的內在數據,定義享元類如下:

function IphoneFlyweight(model, screen, memory) {  this.model = model;  this.screen = screen;  this.memory = memory;}

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

 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];    }  };})();

在這個工廠中,我們定義了一個字典來保存享元對象,提供一個方法根據參數來獲取享元對象,如果字典中有則直接返回,沒有則創建一個返回。
接著我們創建一個客戶端類,這個客戶端類就是修改自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);

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

享元模式在DOM中的應用

享元模式的一個典型應用就是DOM事件操作,DOM事件機制分成事件冒泡和事件捕獲。我們簡單介紹一下這兩者:
事件冒泡:綁定的事件從最里層的元素開始觸發,然后冒泡到最外層
事件捕獲:綁定的事件從最外層的元素開始觸發,然后傳到最里層
假設我們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>

點擊菜單項,進行相應的操作,我們通過jQuery來綁定事件,一般會這么做:

$(".item").on("click", function () {  console.log($(this).text());})

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

$(".menu").on("click", ".item", function () {  console.log($(this).text());})

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

總結

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

享元模式之利:
可以把網頁的資源符合降低幾個數量級。即使享元模式的應用無法將實例的個數削減到一個,你仍能夠從中獲益不少。

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

享元模式之弊:
如果把它用在不必要的地方,其結果反而有損代碼的運行效率。這種模式在優化代碼的同時,也提高了其復雜程度,這會給調試和維護造成困難。

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

這種優化也會使維護變得更加困難?,F在你面對的不是由封裝著數據的對象構成的清晰架構,而是一堆又碎又亂的東西。其中的數據至少分兩處保存。最好注釋標明內在數據和外在數據。

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

這種模式對Javascript程序員特別有用,因為它可以用來減少網頁上所要使用的DOM元素的數量,要知道這些元素需要耗費許多內存。結合使用這種模式與組合模式等組織型可以開發出功能豐富的復雜Web應用系統,它們可以平穩的運行在任何現代Javascript環境中。

享元模式的適用場合:
網頁中必須使用了大量資源密集型對象。如果只會用到少許這類對象,這種優化并不劃算。

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av网站电影| 最近中文字幕mv在线一区二区三区四区| 日韩经典第一页| 亚洲自拍高清视频网站| 高跟丝袜一区二区三区| 久久精品国产成人精品| 亚洲成人aaa| 中文字幕精品—区二区| 成人信息集中地欧美| 国内精品免费午夜毛片| 一区二区三区天堂av| 国产亚洲精品久久久久久777| 日韩精品有码在线观看| 亚洲人成在线一二| 国产日韩在线观看av| 日本一区二区不卡| 国产精品久久久久久久久久99| 久久久av一区| 大伊人狠狠躁夜夜躁av一区| 亚洲精品久久在线| 欧美一级淫片aaaaaaa视频| 狠狠躁夜夜躁久久躁别揉| 中文字幕亚洲综合久久筱田步美| 日本a级片电影一区二区| 精品国内产的精品视频在线观看| 欧美电影免费观看高清完整| 欧美理论电影在线播放| 成人a免费视频| 亚洲欧美成人在线| 在线观看欧美日韩国产| 欧美一乱一性一交一视频| 有码中文亚洲精品| 亚洲第一精品久久忘忧草社区| 国产精品露脸自拍| 久久综合伊人77777尤物| 这里只有精品在线观看| 欧美大片免费观看| 国产精品视频中文字幕91| 国产97在线播放| 国产日韩欧美视频在线| 亚洲人成网站色ww在线| 欧美专区福利在线| 国产亚洲精品美女久久久| 日韩69视频在线观看| 国产精品精品一区二区三区午夜版| 日韩电影视频免费| 欧美日韩一二三四五区| 97人人爽人人喊人人模波多| 国产精品丝袜视频| 黑人巨大精品欧美一区二区三区| 久精品免费视频| xvideos亚洲人网站| 欧美激情第99页| 欧美又大粗又爽又黄大片视频| 成人av在线亚洲| 亚洲欧美日韩区| 国产免费成人av| 久久久999精品视频| 97超视频免费观看| 自拍偷拍亚洲欧美| 日韩视频中文字幕| 欧美视频在线观看 亚洲欧| 欧美激情乱人伦一区| 2020国产精品视频| 中文字幕不卡在线视频极品| 欧洲永久精品大片ww免费漫画| 亚洲天堂视频在线观看| 亚洲成av人影院在线观看| 成人黄色在线观看| 亚洲高清久久久久久| 亚洲va码欧洲m码| 亚洲欧美国产制服动漫| www.xxxx欧美| 动漫精品一区二区| 日韩美女视频免费看| 国产福利精品视频| 九色91av视频| 亚洲国产第一页| 久久久久久69| 国产精品永久免费视频| 热久久视久久精品18亚洲精品| 国模私拍一区二区三区| 在线观看日韩视频| 国产精品丝袜白浆摸在线| 国产丝袜一区二区三区| 日本一欧美一欧美一亚洲视频| 日韩在线精品视频| 日韩中文在线观看| 欧美另类老女人| 亚洲色图校园春色| www.日韩视频| 国产精品高清网站| 亚洲午夜av久久乱码| 亚洲影视九九影院在线观看| 欧美黑人性生活视频| 国模gogo一区二区大胆私拍| www亚洲欧美| 97**国产露脸精品国产| 一区二区三区国产视频| 91国产精品视频在线| 亚洲欧美一区二区三区情侣bbw| 狠狠躁夜夜躁人人躁婷婷91| 欧美大学生性色视频| 国产久一一精品| 亚洲欧美精品中文字幕在线| 国产精品7m视频| 欧美日韩不卡合集视频| 国产视频久久网| 国产精品福利在线| 日韩欧美亚洲综合| 日韩欧美精品中文字幕| 久久久99免费视频| 国产成人福利视频| 国产精品∨欧美精品v日韩精品| 亚洲国产天堂久久综合网| 精品动漫一区二区| 国产精品视频久久久久| 国内精品400部情侣激情| 日韩欧亚中文在线| 久久久久久12| 欧美激情国内偷拍| 久久久人成影片一区二区三区| 亚洲精品av在线播放| 97精品久久久中文字幕免费| 亚洲精品中文字幕女同| 国产精品狠色婷| 在线成人中文字幕| 青草成人免费视频| 色综合色综合久久综合频道88| 亚洲伊人久久大香线蕉av| 欧美在线精品免播放器视频| 久久精品久久久久| 色婷婷av一区二区三区在线观看| 欧美电影《睫毛膏》| 中文字幕日韩视频| 成人免费淫片视频软件| 亚洲黄页网在线观看| 欧美孕妇孕交黑巨大网站| 91网在线免费观看| 日韩在线视频中文字幕| 国产一区二区视频在线观看| 亚洲综合精品一区二区| 日韩电影免费在线观看中文字幕| 91社影院在线观看| 九九热精品视频国产| 成人中心免费视频| 精品美女国产在线| 亚洲图片制服诱惑| 国产久一一精品| 国产精品久久久久久久av大片| 欧美日韩国产成人高清视频| 国产精品视频区| 精品国产一区二区三区久久| 日韩在线免费高清视频| 91在线高清免费观看| 欧美日韩一二三四五区| 亚洲香蕉成人av网站在线观看| 日韩电影免费在线观看| 国产成人综合亚洲| 91精品国产色综合久久不卡98口| 国产精品天天狠天天看| 亚洲成人黄色网址| 国产精品久久久久久久久久久久| 欧美日韩午夜视频在线观看|