設(shè)計(jì)模式 ─── 性能與對(duì)象訪問

性能與對(duì)象訪問,顧名思義就是提高性能和提供對(duì)象訪問。
涉及到性能與對(duì)象訪問的有以下兩種設(shè)計(jì)模式:
① 享元(通過共享資源)
② 代理(通過把操作推遲給代理對(duì)象來提高性能并提供對(duì)象訪問)

一. 享元

在面向?qū)ο蟮脑O(shè)計(jì)中糊肤,利用公共對(duì)象不僅能節(jié)省資源還能提高性能践叠。比如,某個(gè)人物需要一個(gè)類的一百萬個(gè)實(shí)例焦匈,但我們可以把這個(gè)類的一個(gè)實(shí)例讓大家共享赘淮,而把某些獨(dú)特的信息放在外部辕录,節(jié)省的資源可能相當(dāng)可觀。共享的對(duì)象只提供某些內(nèi)在的信息梢卸,而不能用來識(shí)別對(duì)象走诞。
實(shí)現(xiàn)共享模式需要兩個(gè)關(guān)鍵組件,通常是可共享的享元對(duì)象和保存它們的池低剔。某種中央對(duì)象(管理器速梗,或者叫工廠,它維護(hù)池中的享元單元襟齿,通過工廠方法返回享元對(duì)象)維護(hù)這個(gè)池。某些對(duì)象的獨(dú)特狀態(tài)(外在狀態(tài))可以拿到外部
枕赵,在別處管理猜欺,其余部分被共享,這樣我們只需要一個(gè)共同的實(shí)例拷窜,從而節(jié)省內(nèi)存开皿,提高性能。

Flyweight是兩個(gè)具體享元類ConcreteFlyweight1和ConcreteFlyweight2的父接口(基類或協(xié)議)篮昧。每個(gè)ConcreteFlyweight類維護(hù)不能用于識(shí)別對(duì)象的內(nèi)在狀態(tài)intrinsicState(不變的屬性)赋荆。Flyweight聲明了operation:extrinsicState,由這兩個(gè)ConcreteFlyweight類實(shí)現(xiàn)懊昨。intrinsicState是享元對(duì)象中可被共享的部分窄潭,而extrinsicState補(bǔ)充缺少的信息,讓享元對(duì)象唯一酵颁〖的悖客戶端向operation:extrinsicState消息提供extrinsicState,讓享元對(duì)象使用extrinsicState中的獨(dú)一無二的信息完成其任務(wù)躏惋。

享元模式.png

在Cocoa Touch框架中幽污,我們常用的UITableViewCell就是使用享元模式,我們從緩存池中拿出Cell簿姨,賦值展示所需的模型距误,其中賦值給Cell的模型就是extrinsicState,intrinsicState是它固定的屬性,比如ImageView准潭,Label攘乒。所以說,分享相同的資源以執(zhí)行任務(wù)惋鹅,可能比使用個(gè)人的資源完成同樣的事情更加高效则酝。(分享是人類的美德啊)

在以下情況闰集,需要考慮享元模式:(其實(shí)沽讹,下面都是考慮能不能共用一個(gè)實(shí)例∥渎常看能不能把不同點(diǎn)抽出爽雄,共同點(diǎn)放在一個(gè)實(shí)例共用)

  • 應(yīng)用程序使用很多對(duì)象。
  • 在內(nèi)存中保存對(duì)象會(huì)影響內(nèi)存性能沐鼠。
  • 對(duì)象的多數(shù)特有狀態(tài)(外在狀態(tài))可以放在外部而輕量化挚瘟。
  • 移除外在狀態(tài)后,可以用較少的共享對(duì)象替代原來的那組對(duì)象饲梭。
    -應(yīng)用程序不依賴對(duì)象標(biāo)識(shí)乘盖,因?yàn)楣蚕韺?duì)象不能提供唯一的標(biāo)識(shí)。

二. 代理

有的人常把委托認(rèn)為是代理模式憔涉,其實(shí)不然订框。代理可以認(rèn)為是代理人(或者認(rèn)為是經(jīng)紀(jì)人),有人需要洽談合作時(shí)兜叨,先找經(jīng)紀(jì)人穿扳,而不是直接找明星,重要合作時(shí)才會(huì)通過經(jīng)紀(jì)人找到明星国旷。代理的一個(gè)常見用處是作為一個(gè)輕量的替身對(duì)象矛物,它允許客戶端先訪問某些廉價(jià)的信息或功能,直到值得或需要使用“真貨”時(shí)跪但,代理才會(huì)去為客戶端準(zhǔn)備真正的履羞、高價(jià)的資源(就像某些收費(fèi)軟件提供免費(fèi)試用期一樣)。
代理通常是一種替代或者占位特漩,它控制對(duì)另一些對(duì)象的訪問吧雹,而這些對(duì)象可能是遠(yuǎn)程對(duì)象,創(chuàng)建開銷較大的對(duì)象涂身,或者是對(duì)安全性有要求的對(duì)象雄卷。有以下幾種代理:
遠(yuǎn)程代理:為位于不同地址空間或網(wǎng)絡(luò)上的對(duì)象提供本地代表。
虛擬代理:根據(jù)需要?jiǎng)?chuàng)建重型對(duì)象蛤售。
保護(hù)代理:根據(jù)各種訪問權(quán)限控制對(duì)原對(duì)象的訪問丁鹉。
智能引用代理:通過對(duì)真正對(duì)象的引用進(jìn)行計(jì)數(shù)管理內(nèi)存妒潭,也用于鎖定真正對(duì)象,讓其他對(duì)象不能對(duì)其進(jìn)行修改揣钦。

代理模式的思想是使用一個(gè)基本跟實(shí)體對(duì)象行為相同的代理雳灾。客戶端可以“透明地”使用代理冯凹,即不必知悉所面對(duì)的只是一個(gè)代理而不是實(shí)體對(duì)象谎亩。當(dāng)客戶端請(qǐng)求某些創(chuàng)建的開銷較大的功能時(shí),代理把請(qǐng)求轉(zhuǎn)發(fā)給實(shí)體對(duì)象宇姚,準(zhǔn)備好請(qǐng)求的功能并返回給客戶端匈庭。
如下圖,當(dāng)客戶端想Proxy對(duì)象發(fā)送request消息時(shí)浑劳,Proxy對(duì)象會(huì)把這個(gè)消息轉(zhuǎn)發(fā)給Proxy對(duì)象之中的RealSubject對(duì)象阱持,RealSubject會(huì)實(shí)施實(shí)際的操作間接滿足客戶端的請(qǐng)求。

代理模式.png

舉個(gè)例子??:在iOS編程之道中魔熏,用虛擬代理(根據(jù)需要?jiǎng)?chuàng)建重型對(duì)象)懶加載圖像衷咽。一個(gè)列表展示多張圖片,當(dāng)圖片緩存在磁盤時(shí)蒜绽,應(yīng)該先顯示占位符镶骗,再通過后臺(tái)線程去獲取圖片展示。當(dāng)你使用代理模式時(shí)滓窍,就將這些操作封裝在代理類中卖词。

占位圖代理的應(yīng)用.png

在Cococa Touch框架中,也經(jīng)常使用NSProxy來實(shí)現(xiàn)代理模式吏夯,NSProxy作為占位或替代對(duì)象,也可以實(shí)現(xiàn)多繼承的效果即横。iOS代理模式的一個(gè)常見例子是郵件應(yīng)用噪生,郵件消息中收到的附件只會(huì)顯示一些基本信息,比如文件名和大小东囚。當(dāng)用戶點(diǎn)擊占位圖像跺嗽,開始加載附件的內(nèi)容時(shí),圖標(biāo)會(huì)替換為一個(gè)小進(jìn)度視圖页藻,表示實(shí)際加載進(jìn)度桨嫁。如果用戶不點(diǎn)擊占位圖標(biāo),附件就永遠(yuǎn)不會(huì)加載份帐。這不僅節(jié)省了忘了資源璃吧,也節(jié)省了內(nèi)存和郵件應(yīng)用運(yùn)行時(shí)的等待時(shí)間。
在iOS開發(fā)中废境,總是要關(guān)注內(nèi)存的使用量畜挨,所以出于性能考慮筒繁,推薦懶加載技術(shù)。通過使用代理模式巴元,對(duì)開銷大的數(shù)據(jù)實(shí)施懶加載毡咏,如文件系統(tǒng)中的大圖像文件或通過低速網(wǎng)絡(luò)從服務(wù)器下載的大型數(shù)據(jù)。如果大開銷的對(duì)象在收到請(qǐng)求之前不需要加載逮刨,則可通過虛擬代理向客戶端提供某些輕量的信息呕缭。(就是懶加載或輕量加載)

至于代理所在的應(yīng)用場景,就是上面所說的四種代理:遠(yuǎn)程代理修己,虛擬代理恢总,保護(hù)代理,智能引用代理箩退,這邊要根據(jù)具體需求去選擇离熏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市戴涝,隨后出現(xiàn)的幾起案子滋戳,更是在濱河造成了極大的恐慌,老刑警劉巖啥刻,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奸鸯,死亡現(xiàn)場離奇詭異,居然都是意外死亡可帽,警方通過查閱死者的電腦和手機(jī)娄涩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來映跟,“玉大人蓄拣,你說我怎么就攤上這事∨叮” “怎么了球恤?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荸镊。 經(jīng)常有香客問我咽斧,道長,這世上最難降的妖魔是什么躬存? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任张惹,我火速辦了婚禮,結(jié)果婚禮上岭洲,老公的妹妹穿的比我還像新娘宛逗。我一直安慰自己,他們只是感情好钦椭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布拧额。 她就那樣靜靜地躺著碑诉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侥锦。 梳的紋絲不亂的頭發(fā)上进栽,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音恭垦,去河邊找鬼快毛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛番挺,可吹牛的內(nèi)容都是我干的唠帝。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼玄柏,長吁一口氣:“原來是場噩夢啊……” “哼襟衰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粪摘,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤瀑晒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后徘意,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苔悦,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年椎咧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玖详。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勤讽,死狀恐怖蟋座,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脚牍,我是刑警寧澤蜈七,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站莫矗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏砂缩。R本人自食惡果不足惜作谚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庵芭。 院中可真熱鬧妹懒,春花似錦、人聲如沸双吆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匾竿,卻和暖如春瓦宜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岭妖。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工临庇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昵慌。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓假夺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斋攀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子已卷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)淳蔼,斷路器侧蘸,智...
    卡卡羅2017閱讀 134,713評(píng)論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,442評(píng)論 1 92
  • 人和人相遇, 皆是因?yàn)榫壏值臓恳?人對(duì)人珍惜俯画, 都是因?yàn)檎嫘牡脑谝狻?感情析桥,不經(jīng)營就會(huì)斷, 相處艰垂,不真誠就會(huì)散泡仗。...
    feaf5a1303da閱讀 587評(píng)論 0 7
  • 南國一曲傾天下, 古色古香陶醉人猜憎。 樓臺(tái)煙火繁都華娩怎, ...
    南國小溪閱讀 151評(píng)論 0 0
  • P5 父母跟孩子之間三種主要的互動(dòng)方式: 嚴(yán)厲 驕縱 正面管教(什么是正面管教 和善而堅(jiān)定 對(duì)孩子無條件的接納和愛...
    親愛的微風(fēng)閱讀 193評(píng)論 0 0