根本懂得
這個形式有三個症結腳色:原發器(Originator)、備忘錄(Memento)、把守人(caretaker)。三者的根本關系是:原發器創立一個包括其狀況的備忘錄,並傳給把守人。把守人不曉得若何與備忘錄交互,但會把備忘錄放在一個平安的地方保管好。
備忘錄(Memento):在 不損壞封裝性的條件下,捕捉一個對象的外部狀況,並在該對象以外保留這個狀況。如許今後便可以將該對象答復到本來保留的狀況。
Originator(提議人):擔任創立一個備忘錄,用以記載以後時辰它的外部狀況,而且可以使用恢復備忘錄外部狀況。Originator可依據須要決議Memento存儲Originator的哪些外部狀況。
Memento(備忘錄):擔任存儲Originator對象的外部狀況,並可避免Originator之外的其他對象拜訪備忘錄。備忘錄有兩個接口,CareTaker
只能看到備忘錄的窄接口,它只能將備忘錄傳給其他對象。originator可以或許看到一個寬接口,許可它拜訪前往到先前狀況所需的一切數據。
Caretaker(治理者):擔任保留好備忘錄,不克不及對備忘錄的內容停止操作或檢討。
就是把要保留的細節給封裝在了Memento中,哪一天要更改保留的細節也不消影響客戶端了。
備忘錄應用場所
備忘錄形式比擬實用於功效比擬龐雜的,但須要保護或記載屬性汗青的類,或許須要保留的屬性只是浩瀚屬性中的一小部門時,Orignator可以依據保留的Memento信息復原到前一狀況。
假如在某個體系中應用敕令形式時,須要完成敕令的撤消功效,那末敕令形式可使用備忘錄形式來存儲撤消操作的狀況。有的時刻一些對象的外部信息必需要保留在對象之外的處所,然則必需要由對象本身讀取,這時候,應用備忘錄可以把龐雜的對象外部信息對其他的對象屏障起來。
用於獲得狀況的接口會裸露完成接口,須要將其屏障起來。
它普通運用於游戲、文字處置法式的設計中,這類法式須要保留以後高低文的龐雜狀況的快照並在今後恢復處置。
感化
當腳色的狀況轉變時,有能夠這個狀況有效,這時候候便可以應用臨時存儲起來的備忘錄將狀況回復復興。
Cocoa Touch框架中的備忘錄形式
Cocoa Touch框架在歸檔、屬性列表序列化和焦點數據采取了備忘錄形式。
Cocoa的歸檔是對對象和其屬性還有同其他對象間的關系停止編碼,構成一個文檔,該文檔既可保留與文件體系中,也可在過程或收集間傳送。對象與其他對象的關系被看作對象圖的收集。
歸檔進程把對象保留為一種與架構有關的字撙節,堅持對象的標識和對象之間的關系。對象的類型也同數據一路保留。從字撙節解碼出來的對象平日用於對象編碼時雷同的類停止實例化。應用NSCoder的詳細類NSKeyedArchiver和NSKeyedUnarchiver,應用基於鍵的歸檔技巧,被編碼與解碼的對象必需遵照NSCoding協定並完成以下辦法:
-(id)initWithCoder:(NSCoder *)coder;
-(void)encodeWithCoder:(NSCoder *)coder;
實例
添加上面兩個辦法到 ViewController.m 文件:
- (void)saveCurrentState
{
// 當用戶加入運用以後再從新翻開,他想要跟他之前加入時一樣的狀況
// 加入運用,這個時刻我們須要做的是把以後顯示的專輯存儲上去
// 由於只要一小片信息,我們可用 NSUserDefaults 來存儲信息
[[NSUserDefaults standardUserDefaults] setInteger:currentAlbumIndex forKey:@“currentAlbumIndex”];
}
- (void)loadPreviousState
{
currentAlbumIndex = [[NSUserDefaults standardUserDefaults] integerForKey@“currentAlbumIndex”];
[self showDataForAlbumAtIndex:currentAlbumIndex];
}
saveCurrentState 存儲以後專輯的索引到 NSUserDefaults ─ NSUserDefaults 是一個尺度數據存儲,IOS 用來專門寄存法式設置和數據。
loadPreviousState 加載這之前存儲的專輯索引。這不是備忘錄形式的全體,不外你曾經到達目標了。
如今,在 ViewController.m 裡,轉動視圖初始化之前,在 viewDidLoad 裡添加上面一行:
[self loadPreviousState];
當法式啟動的時刻加載上一次存儲的狀況。然則你在哪裡存儲法式確當前狀況呢?你須要應用告訴來做如許的工作。當法式進入後台時,IOS 會發送一個 UIApplicationDidEnterBackgroundNotification 告訴。你可應用這個告訴挪用 saveCurrentState。就這麼便利?
在 viewDidLoad: 最初面添加上面一行
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];
如今,當你的 app 進入後台運轉後,ViewController 會主動挪用 saveCurrentState 存儲以後的狀況。
如今,添加上面代碼:
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
這裡是確保當 ViewController 被釋放時,移除類的 Observer。
構建和運轉你的 app,點擊到一個專輯,用 Command+Shift+H(假如你應用的是模仿器的話) 將法式在後台運轉,然後關失落 app。重啟 app,檢討之前選擇的專輯是否是居中顯示:
專輯數據看起來是對的,然則准確的專輯封面確沒有居中,哪出成績了?
這就是可選辦法 initialVieWindexForHorizontalScroller 的用途!由於這個辦法沒有被拜托履行,ViewController 在這類情形下老是會顯示默許的第一個專輯封面。
修復這個成績,在 ViewController.m 中添加以下代碼:
- (NSInteger)initialVieWindexForHorizontalScroller:(HorizontalScroller *)scroller
{
return currentAlbumIndex;
}
如今 HorizontalScroller 的第一個視圖老是會被設置成 currentAlbumIndex 索引的圖片。這類辦法可以或許確保你的 app 有一個異常棒的用戶體驗,而且它是可恢復的。
從新運轉你的 app,轉動專輯封面,封閉 app,然後重啟確保成績曾經獲得處理:
假如你檢查 PersistencyManger 的初始化辦法,你會留意到專輯的數據是一種硬編碼,PersistencyManger 每次創立,數據也會反復創立一次。有無一種更好的辦法當專輯列表被創立的時刻就存儲它們呢。那末若何把專輯數據存儲到文件裡呢?
一種選擇就是輪回拜訪 Album 的屬性,然後把它存儲在一個 plist 文件裡,當須要它們的時刻從新創立一個 Album 的實例。這不是最好的選擇,這須要你在每個類裡依據分歧的數據或屬性寫特定的代碼。例子,假如稍後你須要一個片子的類,外面有一些分歧的屬性,存儲和加載這些數據你就須要寫一些新的代碼。
另外,你不克不及在每個類的實例裡存儲公有變量,由於他們是弗成拜訪的內部類。這就是為何蘋果要創立歸檔 (Archiving) 機制。
【詳解Objective-C設計形式編程中對備忘錄形式的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!