內(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的類別: