![總結(jié)JavaScript設(shè)計(jì)模式編程中的享元模式使用_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/24/42a00618-897f-4185-b72b-c0d449a27292/42a00618-897f-4185-b72b-c0d449a272921.gif)
![總結(jié)JavaScript設(shè)計(jì)模式編程中的享元模式使用_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/24/42a00618-897f-4185-b72b-c0d449a27292/42a00618-897f-4185-b72b-c0d449a272922.gif)
![總結(jié)JavaScript設(shè)計(jì)模式編程中的享元模式使用_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/24/42a00618-897f-4185-b72b-c0d449a27292/42a00618-897f-4185-b72b-c0d449a272923.gif)
![總結(jié)JavaScript設(shè)計(jì)模式編程中的享元模式使用_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/24/42a00618-897f-4185-b72b-c0d449a27292/42a00618-897f-4185-b72b-c0d449a272924.gif)
![總結(jié)JavaScript設(shè)計(jì)模式編程中的享元模式使用_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/24/42a00618-897f-4185-b72b-c0d449a27292/42a00618-897f-4185-b72b-c0d449a272925.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、總結(jié)javascript設(shè)計(jì)模式編程中的享 元模式使用享元模式不同于一般的設(shè)計(jì)模式,它主要用來優(yōu)化程 序的性能,它最適合解決大量類似的對象而產(chǎn)生的性能問 題。享元模式通過分析應(yīng)用程序的對象,將其解析為內(nèi)在 數(shù)據(jù)和外在數(shù)據(jù),減少對象的數(shù)量,從而提高應(yīng)用程序的 性能?;局R享元模式通過共享大量的細(xì)粒度的對象,減少對象的 數(shù)量,從而減少對象的內(nèi)存,提高應(yīng)用程序的性能。其基 本思想就是分解現(xiàn)有類似對象的組成,將其展開為可以共 享的內(nèi)在數(shù)據(jù)和不可共享的外在數(shù)據(jù),我們稱內(nèi)在數(shù)據(jù)的 對象為享元對象。通常還需要一個(gè)工廠類來維護(hù)內(nèi)在數(shù)據(jù)。在js中,享元模式主要有下面幾個(gè)角色組成:(1) 客戶端:用來調(diào)用享元工
2、廠來獲取內(nèi)在數(shù)據(jù)的類, 通常是應(yīng)用程序所需的對象,(2) 享元工廠:用來維護(hù)享元數(shù)據(jù)的類(3) 享元類:保持內(nèi)在數(shù)據(jù)的類享元模式的實(shí)現(xiàn)和應(yīng)用一般實(shí)現(xiàn)我們舉個(gè)例子進(jìn)行說明:蘋果公司批量生產(chǎn)iph one,iphone的大部分?jǐn)?shù)據(jù)比如型號,屏幕都是一樣,少數(shù)部分 數(shù)據(jù)比如內(nèi)存有分16g, 32g等。未使用享元模式前,我們 寫代碼如下:functionl phone (model , screen, mem ory, sn) n bsp; this mo del=model;nbsp:this screen=scre en;nbsp: t his memory=memory;nbsp ;this s
3、n=sn ; varphones =;for (v ari=0; ilt; 1 000000; i+) nbsp; var memory=i%2=0? 16:32;nbsp;phones push(newlp hone(iphon e6s, 5.0, me mory, i);這段代碼中,創(chuàng)建了一百萬個(gè)iphone,每個(gè)iphone都 獨(dú)立申請一個(gè)內(nèi)存。但是我們仔細(xì)觀察可以看到,大部分 iphone都是類似的,只是內(nèi)存和序列號不一樣,如果是一 個(gè)對性能要求比較高的程序,我們就要考慮去優(yōu)化它。大量相似對象的程序,我們就可以考慮用享元模式去 優(yōu)化它,我們分析出大部分的iphone的型號,屏幕,內(nèi)存
4、都是一樣的,那這部分?jǐn)?shù)據(jù)就可以公用,就是享元模式中 的內(nèi)在數(shù)據(jù),定義享元類如下:function iphoneflywe ight (model, screen, memo ry) nbsp;this model二model;nbs p; this sere en=screen;nbsp;this memory=memo ry;我們定義了iphone的享元類,其中包含型號,屏幕和 內(nèi)存三個(gè)數(shù)據(jù)。我們還需要一個(gè)享元工廠來維護(hù)這些數(shù)據(jù):varf ly weightfacto ry=(functio n() nbsp: va riphones= ;nbspjretur nnbsp;nb sp:get
5、:fline tion(model, screen, memo ry) nbsp; nbsp; nbsp; v arkey=model +screen+mem ory;nbsp;nbsp;nbsp; i f (! iphoneskey) nbs p;nbsp;nbsp;nbsp;iphon eskey=newiphoneflywe ight (model, screen, memo ry);nbsp;nb sp: nbsp:nbsp; nbsp; n bsp; returni phones key;nbsp;nbsp;nbsp;)();在這個(gè)工廠中,我們定義了一個(gè)字典來保存享元對象, 提供一個(gè)
6、方法根據(jù)參數(shù)來獲取享元對象,如果字典中有則 直接返回,沒有則創(chuàng)建一個(gè)返回。接著我們創(chuàng)建一個(gè)客戶端類,這個(gè)客戶端類就是修改 自 iphon e 類:functi onlphone (mo del, screen, memory, sn) nbsp;this flyweight二 flyweightfa ctory. get(m odel, screen , memory);nb sp;this. sn=sn;然后我們依舊像之間那樣生成多個(gè)i phonevarpho nes=;fo r (vari=0; il t; 1000000; i +) nbsp: varmemory=i %2=0?16:3
7、2 ;nbspjpho nes push(ne wlphone (,zip hone6s,5. 0 , memory, i);console 1 og(phones);這里的關(guān)鍵就在于i phone構(gòu)造函數(shù)里面的 this flywe ight=flyweightfactory. get (model, screen, memor y) 0這句代碼通過享元工廠去獲取享元數(shù)據(jù), 而在享元工廠里面,如果已經(jīng)存在相同數(shù)據(jù)的對象則會直 接返回對象,多個(gè)i phone對象共享這部分相同的數(shù)據(jù),所 以原本類似的數(shù)據(jù)已經(jīng)大大減少,減少的內(nèi)存的占用。享元模式在dom中的應(yīng)用享元模式的一個(gè)典型應(yīng)用就是dom事件
8、操作,dom事件機(jī)制分成事件冒泡和事件捕獲。我們簡單介紹一下這兩者: 事件冒泡:綁定的事件從最里層的元素開始觸發(fā),然 后冒泡到最外層事件捕獲:綁定的事件從最外層的元素開始觸發(fā),然后傳到最里層假設(shè)我們html中有一個(gè)菜單列表it; ulclass =/menu/zgt;nbsp; it; li class二item gt;選項(xiàng) lit ;/ligt:nbsp ;lt;l iclass 二 it emz/g t;選項(xiàng) 211; /ligt;nbsp; it; 1 iclass二ite ntgt;選項(xiàng) 31t ;/ligt;nbs p; it; 1 iclas s二itemgt;選項(xiàng) 41t ;/l
9、igt ;nbsp; it; liclass=/it entgt;選項(xiàng) 511 ;/ligt;nb sp; it; licla ss二itentgt ;選項(xiàng) 61t ;/lig t; lt;/ulgt;點(diǎn)擊菜單項(xiàng),進(jìn)行相應(yīng)的操作,我們通過jq uery來綁 定事件,一般會這么做:$ ( item"). on ("click", fun ction () n bsp; console log($ (this ) text ();)給每個(gè)列表項(xiàng)綁定事件,點(diǎn)擊輸出相應(yīng)的文本。這樣 看暫時(shí)沒有什么問題,但是如果是一個(gè)很長的列表,尤其 是在移動端特別長的列表時(shí),就會有性能問
10、題,因?yàn)槊總€(gè) 項(xiàng)都綁定了事件,都占用了內(nèi)存。但是這些事件處理程序 其實(shí)都是很類似的,我們就要對其優(yōu)化。$ (". menu"). on ("click", ". item", fun ction () n bsp;console.log($(this).text();)通過這種方式進(jìn)行事件綁定,可以減少事件處理程序 的數(shù)量,這種方式叫做事件委托,也是運(yùn)用了享元模式的 原理。事件處理程序是公用的內(nèi)在部分,每個(gè)菜單項(xiàng)各自 的文本就是外在部分。我們簡單說下事件委托的原理:點(diǎn) 擊菜單項(xiàng),事件會從li元素冒泡到ul元素,我們綁定事件 到ul上,
11、實(shí)際上就綁定了一個(gè)事件,然后通過事件參數(shù)e vent里面的targ et來判斷點(diǎn)擊的具體是哪一個(gè)元素,比 如低級第一個(gè)li元素,even t. target就是1 i,這樣就能 拿到具體的點(diǎn)擊元素了,就可以根據(jù)不同元素進(jìn)行不同的 處理??偨Y(jié)享元模式是一種優(yōu)化程序性能的手段,通過共享公用 數(shù)據(jù)來減少對象數(shù)量以達(dá)到優(yōu)化程序的手段。享元模式適 用于擁有大量類似對象并且對性能有要求的場景。因?yàn)橄?元模式需要分離內(nèi)部和外部數(shù)據(jù),增加了程序的邏輯復(fù)雜 性,建議對性能有要求的時(shí)候才使用享元模式。享元模式之利:可以把網(wǎng)頁的資源符合降低幾個(gè)數(shù)量級。即使享元模 式的應(yīng)用無法將實(shí)例的個(gè)數(shù)削減到一個(gè),你仍能夠從中獲
12、益不少。這種節(jié)省不需要大量修改原有代碼。在創(chuàng)建了管理器、 工廠和享元之后,就需要對代碼進(jìn)行的修改只不過是從直 接實(shí)例化目標(biāo)類改為調(diào)用管理器對象的某個(gè)方法。享元模式之弊:如果把它用在不必要的地方,其結(jié)果反而有損代碼的 運(yùn)行效率。這種模式在優(yōu)化代碼的同時(shí),也提高了其復(fù)雜 程度,這會給調(diào)試和維護(hù)造成困難。它之所以會妨礙調(diào)試,是因?yàn)楝F(xiàn)在可能出錯(cuò)的地方變 成了三個(gè):管理器、工廠和享元。這種優(yōu)化也會使維護(hù)變得更加困難?,F(xiàn)在你面對的不 是由封裝著數(shù)據(jù)的對象構(gòu)成的清晰架構(gòu),而是一堆又碎又 亂的東西。其中的數(shù)據(jù)至少分兩處保存。最好注釋標(biāo)明內(nèi) 在數(shù)據(jù)和外在數(shù)據(jù)。只有在必要的時(shí)候才應(yīng)該進(jìn)行這種優(yōu)化。必須在運(yùn)行 效率和可維護(hù)性之間進(jìn)行權(quán)衡。如果拿不準(zhǔn)是否需要使用 享元模式,那么你很可能并不需要它。享元模式適合的是 系統(tǒng)資源已經(jīng)用得差不多而且明顯需要進(jìn)行某種優(yōu)化這樣 一類場合。這種模式對javas cript程序員特別有用,因?yàn)樗梢?用來減少網(wǎng)頁上所要使用的dom元素的數(shù)量,要知道這些 元素需要耗費(fèi)許多內(nèi)存。結(jié)合使用這種模式與組合模式等 組織型可以開發(fā)出功能豐富的復(fù)雜web應(yīng)用系統(tǒng),它們可 以平穩(wěn)的運(yùn)行在任何現(xiàn)代jav
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國變調(diào)低音長號行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年低壓三相感應(yīng)電動機(jī)項(xiàng)目可行性研究報(bào)告
- 2025至2030年銀牌猴王香煙項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年中國鋼柱式散熱器數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年相框套項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年滌粘坯布項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年中國PS桂絨片數(shù)據(jù)監(jiān)測研究報(bào)告
- 車輛合同買賣
- 樓房建設(shè)承包合同范本
- 鏟車與叉車租賃合同范本
- 2025年度有限責(zé)任公司拆伙協(xié)議書范本4篇
- 【8道期末】安徽省蕪湖市2024-2025學(xué)年八年級上學(xué)期期末道德與法治試題(含解析)
- 七年級數(shù)學(xué)新北師大版(2024)下冊第一章《整式的乘除》單元檢測習(xí)題(含簡單答案)
- 2025中考關(guān)于名詞的語法填空專練(二)(含答案)
- 3可伸縮的橡皮筋 說課稿-2023-2024學(xué)年科學(xué)二年級下冊冀人版
- 2024年財(cái)政部會計(jì)法律法規(guī)答題活動題目及答案一
- 班組現(xiàn)場5S與目視化管理
- 2024年01月廣州期貨交易所2024年招考筆試歷年參考題庫附帶答案詳解
- 和達(dá)投資集團(tuán)(杭州)有限公司招聘筆試沖刺題2025
- 政企單位春節(jié)元宵猜燈謎活動謎語200個(gè)(含謎底)
- 人工智能數(shù)據(jù)標(biāo)注百億產(chǎn)業(yè)詳細(xì)介紹
評論
0/150
提交評論