IOS設計模式-備忘錄模式

一、如何存儲記錄git

在存儲記錄時,第一步咱們須要用一把鑰匙去打開一把鎖。第二步,當咱們打開鎖以後就會有黑盒子,咱們一開始還不知道里面有什麼,因此是黑盒子。github

一、存儲記錄的必要性設計模式

生活中,好比去超市購物有時候就須要在入口儲物櫃存放本身的包裹安全

二、記錄的惟一標示工具

儲物櫃對應一把鑰匙和號碼標示。測試

三、存儲記錄與取出記錄優化

===============================================================================================網站


根據上面的思惟導圖:備忘錄模式有:1.有key值(惟一標示符) 2.獲取與key對應的存儲物品 3.能夠存儲多樣性的對象。編碼

 

備忘錄模式的UML圖:設計

 

二、備忘錄模式的基本原理

Originator原由;起源;創做者;發起人,對象:可以生成備忘錄中心的狀態值 Memento記念品,記錄,備忘錄中心,可以將對象生成的備忘錄中的狀態值進行存儲或者取出值 Caretaker看門人,備忘錄中心存在黑箱子裏的物品

  設計存儲中心,好比超市裏的儲物櫃

  指定存儲接口,

  實現存儲機制,


備忘錄模式(Memento Pattern)又叫作快照模式(Snapshot Pattern)或Token模式,是GoF的23種設計模式之一,屬於行爲模式。

定義:在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到原先保存的狀態。

涉及角色:

1.Originator(發起人):負責建立一個備忘錄Memento,用以記錄當前時刻自身的內部狀態,並可以使用備忘錄恢復內部狀態。

  Originator能夠根據須要決定Memento存儲本身的哪些內部狀態。

2.Memento(備忘錄):負責存儲Originator對象的內部狀態,並能夠防止Originator之外的其餘對象訪問備忘錄。

  備忘錄有兩個接口:Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其餘對象。

  Originator卻可看到備忘錄的寬接口,容許它訪問返回到先前狀態所須要的全部數據。

3.Caretaker(管理者):負責備忘錄Memento,不能對Memento的內容進行訪問或者操做。


三、使用備忘錄模式

開始上代碼 :



爲何存儲一個對象的狀態只須要存儲這個對象的屬性便可?


  一個對象是由屬性和方法組成的。在對象的生命週期中,從alloc-init建立到銷燬,會不斷變化的是屬性,而行爲方法仍舊仍是那個行爲方法。

    (若是對象的方法要變,好比將飛鳥的「飛」的行爲變成「游泳」,那也只能更改建立這個對象的類對應的方法,注意哦,

      是經過改變類的方法而改變這個對象的方法哦,除此以外,正在活動的對象方法是不可能改變的。)


  那麼屬性呢?屬性確定會變的,更況且若是銷燬了一個對象,從新alloc-init方法出來的新的對象的屬性確定是和前一個對象不同。


  因此綜上所述,要保存一個對象,通常只要保存這個對象的屬性狀態便可。

  最後,OC通常用字典來保存對象的屬性狀態("屬性-值:key-value""字典的鍵-值對:key-value")。





接着新建一個普通的Apple類,模擬須要存儲的對象,接收協議實現相關的方法。


而後拷貝Fastcoding源碼進工程。


到這裏的源代碼百度雲下載連接: http://pan.baidu.com/s/1gekVZmN 密碼: xcvs  (該工程裏的Fastcoding已經設置好了MRC模式)

 

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

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

  2.優勢: 普通對象直接轉換成NSData,直接存儲,效率高於NSCoding,編碼也比NSCoding好用

  3.缺點:項目ARC,Fastcoding(MRC)

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

 

在github網站裏https://github.com/nicklockwood/FastCoding,能夠下載到FastCoding源碼,而後拷貝進工程,最後設置好MRC便可。



 

爲了方法實現嚴謹和安全,在代碼中使用NSParameterAssert(object); ,若是object爲nil,那麼這段程序就會直接使得整個應用程序崩潰。

並在MetentoCenter中使用Fastcoding和NSUserDefaults:


而後測試:

先使用MetentoCenter存儲狀態:


而後經過MetentoCenter讀取存儲的狀態:


 到這裏爲止,源代碼百度雲下載連接: http://pan.baidu.com/s/1kTXWCAj 密碼: pfd9

四、優化存儲方案

 

 優化開始,建立一個NSObject的類別:


測試代碼:


 該源代碼"終結版"百度下載連接: http://pan.baidu.com/s/1jGWCK9C 密碼: 7hdg

五、恢復UIView的狀態

 以前備忘錄的源代碼中MetentoCenter是徹底可複用的,因此直接提出來放在一個文件夾裏,而且備份在百度雲連接: http://pan.baidu.com/s/1ntRMVtZ 密碼: n94v

 

下載以後,使用方法示例:



 

而後就能夠爲這個繼承自UIView的子類HYView進行狀態屬性的備份。好比,我這裏示例備份其frame屬性:

 

 那麼還要實現遵循協議裏的方法:


 

接下來就直接進行測試代碼,記得在使用的地方要導入MetentoCenter的類別:


 


 

 這部分的源代碼百度雲連接: http://pan.baidu.com/s/1sk16B7Z 密碼: bs89

 

這裏重寫更新一下MetentoCenter封裝好的可複用的源代碼百度雲連接: http://pan.baidu.com/s/1qXsfnBm 密碼: pay4

  (以前的沒有問題,只是有方法用詞不對,我這裏僅僅是更改了方法名用詞)

相關文章
相關標籤/搜索