欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Objective-C設(shè)計(jì)模式編程中對備忘錄模式的運(yùn)用

 更新時間:2016年03月23日 17:01:46   作者:李剛  
這篇文章主要介紹了Objective-C設(shè)計(jì)模式編程中對備忘錄模式的運(yùn)用,文中結(jié)合了Cocoa框架下應(yīng)用的實(shí)例來加以講解,需要的朋友可以參考下

基本理解
這個模式有三個關(guān)鍵角色:原發(fā)器(Originator)、備忘錄(Memento)、看管人(caretaker)。三者的基本關(guān)系是:原發(fā)器創(chuàng)建一個包含其狀態(tài)的備忘錄,并傳給看管人??垂苋瞬恢廊绾闻c備忘錄交互,但會把備忘錄放在一個安全之處保管好。
備忘錄(Memento):在 不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可以將該對象回復(fù)到原先保存的狀態(tài)。
Originator(發(fā)起人):負(fù)責(zé)創(chuàng)建一個備忘錄,用以記錄當(dāng)前時刻它的內(nèi)部狀態(tài),并且可使用恢復(fù)備忘錄內(nèi)部狀態(tài)。Originator可根據(jù)需要決定Memento存儲Originator的哪些內(nèi)部狀態(tài)。
Memento(備忘錄):負(fù)責(zé)存儲Originator對象的內(nèi)部狀態(tài),并可防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口,CareTaker
只能看到備忘錄的窄接口,它只能將備忘錄傳給其他對象。originator能夠看到一個寬接口,允許它訪問返回到先前狀態(tài)所需的所有數(shù)據(jù)。
Caretaker(管理者):負(fù)責(zé)保存好備忘錄,不能對備忘錄的內(nèi)容進(jìn)行操作或檢查。
就是把要保存的細(xì)節(jié)給封裝在了Memento中,哪一天要更改保存的細(xì)節(jié)也不用影響客戶端了。

備忘錄使用場合
備忘錄模式比較適用于功能比較復(fù)雜的,但需要維護(hù)或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一小部分時,Orignator可以根據(jù)保存的Memento信息還原到前一狀態(tài)。
如果在某個系統(tǒng)中使用命令模式時,需要實(shí)現(xiàn)命令的撤銷功能,那么命令模式可以使用備忘錄模式來存儲撤銷操作的狀態(tài)。有的時候一些對象的內(nèi)部信息必須要保存在對象以外的地方,但是必須要由對象自己讀取,這時,使用備忘錄可以把復(fù)雜的對象內(nèi)部信息對其他的對象屏蔽起來。
用于獲取狀態(tài)的接口會暴露實(shí)現(xiàn)接口,需要將其屏蔽起來。
它一般應(yīng)用于游戲、文字處理程序的設(shè)計(jì)中,這種程序需要保存當(dāng)前上下文的復(fù)雜狀態(tài)的快照并在以后恢復(fù)處理。

作用
當(dāng)角色的狀態(tài)改變時,有可能這個狀態(tài)無效,這時候就可以使用暫時存儲起來的備忘錄將狀態(tài)復(fù)原。
Cocoa Touch框架中的備忘錄模式
Cocoa Touch框架在歸檔、屬性列表序列化和核心數(shù)據(jù)采用了備忘錄模式。
Cocoa的歸檔是對對象以及其屬性還有同其他對象間的關(guān)系進(jìn)行編碼,形成一個文檔,該文檔既可保存與文件系統(tǒng)中,也可在進(jìn)程或網(wǎng)絡(luò)間傳送。對象與其他對象的關(guān)系被看做對象圖的網(wǎng)絡(luò)。
歸檔過程把對象保存為一種與架構(gòu)無關(guān)的字節(jié)流,保持對象的標(biāo)識以及對象之間的關(guān)系。對象的類型也同數(shù)據(jù)一起保存。從字節(jié)流解碼出來的對象通常用于對象編碼時相同的類進(jìn)行實(shí)例化。使用NSCoder的具體類NSKeyedArchiver和NSKeyedUnarchiver,使用基于鍵的歸檔技術(shù),被編碼與解碼的對象必須遵守NSCoding協(xié)議并實(shí)現(xiàn)以下方法:

復(fù)制代碼 代碼如下:

-(id)initWithCoder:(NSCoder *)coder;
-(void)encodeWithCoder:(NSCoder *)coder;

實(shí)例
添加下面兩個方法到 ViewController.m 文件:

復(fù)制代碼 代碼如下:

- (void)saveCurrentState
{
    // 當(dāng)用戶退出應(yīng)用之后再重新打開,他想要跟他之前退出時一樣的狀態(tài)
    // 退出應(yīng)用,這個時候我們需要做的是把當(dāng)前顯示的專輯存儲下來
    // 因?yàn)橹挥幸恍∑畔?,我們可?NSUserDefaults 來存儲信息
    [[NSUserDefaults standardUserDefaults] setInteger:currentAlbumIndex forKey:@“currentAlbumIndex”];
}

- (void)loadPreviousState
{
    currentAlbumIndex = [[NSUserDefaults standardUserDefaults] integerForKey@“currentAlbumIndex”];
    [self showDataForAlbumAtIndex:currentAlbumIndex];
}


saveCurrentState 存儲當(dāng)前專輯的索引到 NSUserDefaults ─ NSUserDefaults 是一個標(biāo)準(zhǔn)數(shù)據(jù)存儲,iOS 用來專門存放程序設(shè)置和數(shù)據(jù)。

loadPreviousState 加載這之前存儲的專輯索引。這不是備忘錄模式的全部,不過你已經(jīng)達(dá)到目的了。

現(xiàn)在,在 ViewController.m 里,滾動視圖初始化之前,在 viewDidLoad 里添加下面一行:

復(fù)制代碼 代碼如下:

[self loadPreviousState];

當(dāng)程序啟動的時候加載上一次存儲的狀態(tài)。但是你在哪里存儲程序的當(dāng)前狀態(tài)呢?你需要使用通知來做這樣的事情。當(dāng)程序進(jìn)入后臺時,iOS 會發(fā)送一個 UIApplicationDidEnterBackgroundNotification 通知。你可利用這個通知調(diào)用 saveCurrentState。就這么方便?

在 viewDidLoad: 最后面添加下面一行

復(fù)制代碼 代碼如下:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];

現(xiàn)在,當(dāng)你的 app 進(jìn)入后臺運(yùn)行后,ViewController 會自動調(diào)用 saveCurrentState 存儲當(dāng)前的狀態(tài)。

現(xiàn)在,添加下面代碼:

復(fù)制代碼 代碼如下:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

這里是確保當(dāng) ViewController 被釋放時,移除類的 Observer。

構(gòu)建和運(yùn)行你的 app,點(diǎn)擊到一個專輯,用 Command+Shift+H(如果你使用的是模擬器的話) 將程序在后臺運(yùn)行,然后關(guān)掉 app。重啟 app,檢查之前選擇的專輯是不是居中顯示:

2016323170032314.png (214×320)

專輯數(shù)據(jù)看起來是對的,但是正確的專輯封面確沒有居中,哪出問題了?

這就是可選方法 initialViewIndexForHorizontalScroller 的用處!因?yàn)檫@個方法沒有被委托執(zhí)行,ViewController 在這種情況下總是會顯示默認(rèn)的第一個專輯封面。

修復(fù)這個問題,在 ViewController.m 中添加如下代碼:

復(fù)制代碼 代碼如下:

- (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller
{
    return currentAlbumIndex;
}

現(xiàn)在 HorizontalScroller 的第一個視圖總是會被設(shè)置成 currentAlbumIndex 索引的圖片。這種方法能夠確保你的 app 有一個非常棒的用戶體驗(yàn),并且它是可恢復(fù)的。

重新運(yùn)行你的 app,滾動專輯封面,關(guān)閉 app,然后重啟確保問題已經(jīng)得到解決:

2016323170107827.png (214×320)

如果你查看 PersistencyManger 的初始化方法,你會注意到專輯的數(shù)據(jù)是一種硬編碼,PersistencyManger 每次創(chuàng)建,數(shù)據(jù)也會重復(fù)創(chuàng)建一次。有沒有一種更好的方法當(dāng)專輯列表被創(chuàng)建的時候就存儲它們呢。那么如何把專輯數(shù)據(jù)存儲到文件里呢?

一種選擇就是循環(huán)訪問 Album 的屬性,然后把它存儲在一個 plist 文件里,當(dāng)需要它們的時候重新創(chuàng)建一個 Album 的實(shí)例。這不是最好的選擇,這需要你在每一個類里根據(jù)不同的數(shù)據(jù)或?qū)傩詫懱囟ǖ拇a。例子,如果稍后你需要一個電影的類,里面有一些不同的屬性,存儲和加載這些數(shù)據(jù)你就需要寫一些新的代碼。

此外,你不能在每一個類的實(shí)例里存儲私有變量,因?yàn)樗麄兪遣豢稍L問的外部類。這就是為什么蘋果要創(chuàng)建歸檔 (Archiving) 機(jī)制。

相關(guān)文章

  • iOS實(shí)現(xiàn)多個垂直滑動條并列視圖

    iOS實(shí)現(xiàn)多個垂直滑動條并列視圖

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)多個垂直滑動條并列視圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 仿IOS效果 帶彈簧動畫的ListView

    仿IOS效果 帶彈簧動畫的ListView

    這篇文章主要介紹了仿IOS效果,帶彈簧動畫的ListView,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Flutter CustomPaint繪制widget使用示例

    Flutter CustomPaint繪制widget使用示例

    這篇文章主要為大家介紹了Flutter CustomPaint繪制widget使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 淺談WKWebView 在64位設(shè)備上的白屏問題

    淺談WKWebView 在64位設(shè)備上的白屏問題

    下面小編就為大家?guī)硪黄獪\談WKWebView 在64位設(shè)備上的白屏問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • iOS9提示框的正確使用方式

    iOS9提示框的正確使用方式

    這篇文章主要為大家詳細(xì)介紹了iOS9提示框的正確使用方式,iOS8升級到iOS9的過程,彈出提示框的方式有了很大的改變,感興趣的小伙伴們可以參考一下
    2016-05-05
  • iOS安全防護(hù)系列之ptrace反調(diào)試與匯編調(diào)用系統(tǒng)方法詳解

    iOS安全防護(hù)系列之ptrace反調(diào)試與匯編調(diào)用系統(tǒng)方法詳解

    這篇文章主要給大家介紹了關(guān)于iOS安全防護(hù)系列之ptrace反調(diào)試與匯編調(diào)用系統(tǒng)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 詳解iOS 實(shí)現(xiàn)一對多代理方案

    詳解iOS 實(shí)現(xiàn)一對多代理方案

    本文主要介紹了iOS 實(shí)現(xiàn)一對多代理方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 2016 cocoapods的安裝和使用方法以及版本升級遇到的問題

    2016 cocoapods的安裝和使用方法以及版本升級遇到的問題

    CocoaPods是一個負(fù)責(zé)管理iOS項(xiàng)目中第三方開源庫的工具,通過CocoaPods,我們可以將第三方的依賴庫統(tǒng)一管理起來,配置和更新只需要通過簡單的幾行命令即可完成,需要的朋友可以參考下
    2016-09-09
  • 去除IOS蘋果手機(jī)自帶按鈕樣式的方法(推薦)

    去除IOS蘋果手機(jī)自帶按鈕樣式的方法(推薦)

    下面小編就為大家分享一篇去除IOS蘋果手機(jī)自帶按鈕樣式的方法(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS改變UITextField占位文字顏色的三種方法

    iOS改變UITextField占位文字顏色的三種方法

    這篇文章主要為大家詳細(xì)介紹了iOS改變UITextField的占位文字顏色的三種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評論