備忘錄模式

內(nèi)容大綱

如何存儲(chǔ)記錄

備忘錄模式的基本原理

使用備忘錄模式

優(yōu)化存儲(chǔ)方案

恢復(fù)UIView的狀態(tài)

1嚣镜、如何存儲(chǔ)記錄

在存儲(chǔ)記錄時(shí)究飞,第一步我們需要用一把鑰匙去打開一把鎖箱亿。第二步逛犹,當(dāng)我們打開鎖之后就會(huì)有黑盒子气笙,我們一開始還不知道里面有什么,所以是黑盒子醋火。

1悠汽、存儲(chǔ)記錄的必要性

生活中箱吕,比如去超市購(gòu)物有時(shí)候就需要在入口儲(chǔ)物柜存放自己的包裹

2、記錄的唯一標(biāo)示

儲(chǔ)物柜對(duì)應(yīng)一把鑰匙和號(hào)碼標(biāo)示柿冲。

3殖氏、存儲(chǔ)記錄與取出記錄

===============================================================================================

根據(jù)上面的思維導(dǎo)圖:備忘錄模式有:1.有key值(唯一標(biāo)示符) 2.獲取與key對(duì)應(yīng)的存儲(chǔ)物品 3.可以存儲(chǔ)多樣性的對(duì)象。


備忘錄模式的UML圖:


2姻采、備忘錄模式的基本原理

Originator起因;起源;創(chuàng)作者;發(fā)起人,對(duì)象:能夠生成備忘錄中心的狀態(tài)值 Memento紀(jì)念品,記錄爵憎,備忘錄中心慨亲,能夠?qū)?duì)象生成的備忘錄中的狀態(tài)值進(jìn)行存儲(chǔ)或者取出值 Caretaker看門人,備忘錄中心存在黑箱子里的物品

設(shè)計(jì)存儲(chǔ)中心宝鼓,比如超市里的儲(chǔ)物柜  指定存儲(chǔ)接口刑棵,  實(shí)現(xiàn)存儲(chǔ)機(jī)制,

備忘錄模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式愚铡,是GoF的23種設(shè)計(jì)模式之一蛉签,屬于行為模式。

定義:在不破壞封閉的前提下沥寥,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài)碍舍,并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)邑雅。

涉及角色:

1.Originator(發(fā)起人):負(fù)責(zé)創(chuàng)建一個(gè)備忘錄Memento片橡,用以記錄當(dāng)前時(shí)刻自身的內(nèi)部狀態(tài),并可使用備忘錄恢復(fù)內(nèi)部狀態(tài)淮野。

Originator可以根據(jù)需要決定Memento存儲(chǔ)自己的哪些內(nèi)部狀態(tài)捧书。

2.Memento(備忘錄):負(fù)責(zé)存儲(chǔ)Originator對(duì)象的內(nèi)部狀態(tài),并可以防止Originator以外的其他對(duì)象訪問備忘錄骤星。

備忘錄有兩個(gè)接口:Caretaker只能看到備忘錄的窄接口经瓷,他只能將備忘錄傳遞給其他對(duì)象。

Originator卻可看到備忘錄的寬接口洞难,允許它訪問返回到先前狀態(tài)所需要的所有數(shù)據(jù)舆吮。

3.Caretaker(管理者):負(fù)責(zé)備忘錄Memento,不能對(duì)Memento的內(nèi)容進(jìn)行訪問或者操作廊营。

3歪泳、使用備忘錄模式

開始上代碼 :

為什么存儲(chǔ)一個(gè)對(duì)象的狀態(tài)只需要存儲(chǔ)這個(gè)對(duì)象的屬性即可?

一個(gè)對(duì)象是由屬性和方法組成的露筒。在對(duì)象的生命周期中呐伞,從alloc-init創(chuàng)建到銷毀,會(huì)不斷變化的是屬性慎式,而行為方法仍舊還是那個(gè)行為方法伶氢。

(如果對(duì)象的方法要變趟径,比如將飛鳥的“飛”的行為變成“游泳”,那也只能更改創(chuàng)建這個(gè)對(duì)象的類對(duì)應(yīng)的方法癣防,注意哦蜗巧,

是通過改變類的方法而改變這個(gè)對(duì)象的方法哦,除此之外蕾盯,正在活動(dòng)的對(duì)象方法是不可能改變的幕屹。)

那么屬性呢?屬性肯定會(huì)變的级遭,更何況如果銷毀了一個(gè)對(duì)象望拖,重新alloc-init方法出來的新的對(duì)象的屬性肯定是和前一個(gè)對(duì)象不一樣。

  所以綜上所述挫鸽,要保存一個(gè)對(duì)象说敏,一般只要保存這個(gè)對(duì)象的屬性狀態(tài)即可。

  最后丢郊,OC一般用字典來保存對(duì)象的屬性狀態(tài)("屬性-值:key-value""字典的鍵-值對(duì):key-value")盔沫。

接著新建一個(gè)普通的Apple類,模擬需要存儲(chǔ)的對(duì)象枫匾,接收協(xié)議實(shí)現(xiàn)相關(guān)的方法架诞。

然后拷貝Fastcoding源碼進(jìn)工程。

到這里的源代碼百度云下載鏈接:http://pan.baidu.com/s/1gekVZmN密碼: xcvs? (該工程里的Fastcoding已經(jīng)設(shè)置好了MRC模式)


另外介紹:FastCoding(第三方序列化對(duì)象工具)

1.定義: 本地序列化工具

2.優(yōu)點(diǎn): 普通對(duì)象直接轉(zhuǎn)換成NSData,直接存儲(chǔ),效率高于NSCoding,編碼也比NSCoding好用

3.缺點(diǎn):項(xiàng)目ARC,Fastcoding(MRC)

4.使用條件:MRC(需要用-fno-objc-arc)


在github網(wǎng)站里https://github.com/nicklockwood/FastCoding婿牍,可以下載到FastCoding源碼侈贷,然后拷貝進(jìn)工程,最后設(shè)置好MRC即可等脂。


為了方法實(shí)現(xiàn)嚴(yán)謹(jǐn)和安全俏蛮,在代碼中使用NSParameterAssert(object); ,如果object為nil上遥,那么這段程序就會(huì)直接使得整個(gè)應(yīng)用程序崩潰搏屑。

并在MetentoCenter中使用Fastcoding和NSUserDefaults:

然后測(cè)試:

先使用MetentoCenter存儲(chǔ)狀態(tài):

然后通過MetentoCenter讀取存儲(chǔ)的狀態(tài):

到這里為止,源代碼百度云下載鏈接:?http://pan.baidu.com/s/1kTXWCAj?密碼: pfd9

4粉楚、優(yōu)化存儲(chǔ)方案

?優(yōu)化開始辣恋,創(chuàng)建一個(gè)NSObject的類別:

測(cè)試代碼:

該源代碼"終結(jié)版"百度下載鏈接:?http://pan.baidu.com/s/1jGWCK9C?密碼: 7hdg

5、恢復(fù)UIView的狀態(tài)

之前備忘錄的源代碼中MetentoCenter是完全可復(fù)用的模软,所以直接提出來放在一個(gè)文件夾里伟骨,并且備份在百度云鏈接:?http://pan.baidu.com/s/1ntRMVtZ?密碼: n94v


下載之后,使用方法示例:


然后就可以為這個(gè)繼承自UIView的子類HYView進(jìn)行狀態(tài)屬性的備份燃异。比如携狭,我這里示例備份其frame屬性:


?那么還要實(shí)現(xiàn)遵循協(xié)議里的方法:


接下來就直接進(jìn)行測(cè)試代碼,記得在使用的地方要導(dǎo)入MetentoCenter的類別:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末回俐,一起剝皮案震驚了整個(gè)濱河市逛腿,隨后出現(xiàn)的幾起案子稀并,更是在濱河造成了極大的恐慌,老刑警劉巖单默,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘举,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搁廓,警方通過查閱死者的電腦和手機(jī)引颈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境蜕,“玉大人线欲,你說我怎么就攤上這事∑。” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵苦锨,是天一觀的道長(zhǎng)逼泣。 經(jīng)常有香客問我,道長(zhǎng)舟舒,這世上最難降的妖魔是什么拉庶? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮秃励,結(jié)果婚禮上氏仗,老公的妹妹穿的比我還像新娘。我一直安慰自己夺鲜,他們只是感情好皆尔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著币励,像睡著了一般慷蠕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上食呻,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天流炕,我揣著相機(jī)與錄音,去河邊找鬼仅胞。 笑死每辟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的干旧。 我是一名探鬼主播渠欺,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼莱革!你這毒婦竟也來了峻堰?” 一聲冷哼從身側(cè)響起讹开,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捐名,沒想到半個(gè)月后旦万,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镶蹋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年成艘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贺归。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淆两,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拂酣,到底是詐尸還是另有隱情秋冰,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布婶熬,位于F島的核電站剑勾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赵颅。R本人自食惡果不足惜虽另,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饺谬。 院中可真熱鬧捂刺,春花似錦、人聲如沸募寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拔鹰。三九已至苛谷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間格郁,已是汗流浹背腹殿。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留例书,地道東北人锣尉。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像决采,于是被迫代替她去往敵國(guó)和親自沧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 1 場(chǎng)景問題# 1.1 開發(fā)仿真系統(tǒng)## 考慮這樣一個(gè)仿真應(yīng)用,功能是:模擬運(yùn)行針對(duì)某個(gè)具體問題的多個(gè)解決方案拇厢,記...
    七寸知架構(gòu)閱讀 2,150評(píng)論 1 50
  • 定義 備忘錄模式又叫做快照模式(Snapshot Pattern)或Token模式爱谁,是對(duì)象的行為模式。 備忘錄對(duì)象...
    步積閱讀 2,943評(píng)論 0 2
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是備忘錄模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 一...
    w1992wishes閱讀 598評(píng)論 0 1
  • 備忘錄模式概述 備忘錄模式提供了一種狀態(tài)恢復(fù)的實(shí)現(xiàn)機(jī)制孝偎,使得用戶可以方便地回到一個(gè)特定的歷史步驟访敌,當(dāng)新的狀態(tài)無效或...
    編程技術(shù)閱讀 1,388評(píng)論 0 1
  • 背包里的鑰匙和手機(jī)殼撞擊的聲音像極了跟隨的腳步,隨著一步一步地走在短橋上衣盾,噠寺旺,噠,噠势决,也一步一響的跟在身后 第一次...
    菠蘿U閱讀 269評(píng)論 1 1