最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

設(shè)計模式中的Memento備忘錄模式的在iOS App開發(fā)中的運用

 更新時間:2016年03月23日 16:53:56   作者:TonyGo  
這篇文章主要介紹了設(shè)計模式中的Memento備忘錄模式的在iOS App開發(fā)中的運用,Memento著重于捕獲和具體化當(dāng)前對象的內(nèi)部狀態(tài),需要的朋友可以參考下

備忘錄模式。顧名思義,備忘錄模式的初衷就是為了返回上一個狀態(tài)而設(shè)計的。從名字看起來一目了然,好吧,還是老樣子,先給出定義。

備忘錄(Memento):在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。

定義看起來搞的很專業(yè),其實就是保存上一個狀態(tài),以便日后恢復(fù)用。好比是在玩游戲,在打大Boss之前擔(dān)心第一次打不過,先存?zhèn)€盤,萬一玩兒完了,還可以恢復(fù)狀態(tài)重新PK。

下面給出類結(jié)構(gòu)圖。

2016323164621128.jpg (500×290)

Originator(原發(fā)器):記錄當(dāng)前時刻的內(nèi)部狀態(tài),負(fù)責(zé)定義哪些屬于需要備份的狀態(tài),負(fù)責(zé)創(chuàng)建memento,負(fù)責(zé)從memento恢復(fù)狀態(tài)。

Memento(備忘錄):負(fù)責(zé)存儲Originator的內(nèi)部狀態(tài),在需要時提供給Originator內(nèi)部狀態(tài)。

Caretaker(看管人):將Memento保存在安全的地方,并負(fù)責(zé)提取。

一句話概括:Originator創(chuàng)建一個包含其狀態(tài)的Memento交給Caretaker保管,Caretaker不知如何與Memento交互,只負(fù)責(zé)把Memento在安全的地方保存好。
從上面這張圖來看,關(guān)系比較簡單吧。那么備忘錄模式一般都用在什么場合呢?

Memento模式比較適用于功能比較復(fù)雜的,但需要維護(hù)或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一小部分時,Originator可以根據(jù)保存的Memento信息還原到前一狀態(tài)。有時候一些對象的內(nèi)部信息必須保存在對象以外的地方,但是必須要由對象自己讀取,這時,使用備忘錄可以把復(fù)雜的對象內(nèi)部信息對其他的對象屏蔽起來。當(dāng)然了,最大的作用還是在于當(dāng)角色的狀態(tài)改變的時候,有可能這個狀態(tài)無效,這時候就可以使用暫時存儲起來的備忘錄將狀態(tài)進(jìn)行復(fù)原。好啦,其實翻來覆去就是為了恢復(fù)數(shù)據(jù)用的,車轱轆話就不多說了,下面給大家簡單展示一下實現(xiàn)的代碼吧。

Objective-C代碼實現(xiàn):

Originator:

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

//發(fā)起人:記錄當(dāng)前時刻的內(nèi)部狀態(tài),負(fù)責(zé)定義哪些屬于備份范圍的狀態(tài),負(fù)責(zé)創(chuàng)建和恢復(fù)備忘錄數(shù)據(jù)。
 
#import <Foundation/Foundation.h>
@class NimoMemento;
 
@interface NimoOriginator : NSObject
 
@property (nonatomic, copy) NSString* state;
 
- (NimoMemento *)createMemento;
- (void)restoreMemento:(NimoMemento *)memento;
 
@end

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

#import "NimoOriginator.h"
#import "NimoMemento.h"
 
@implementation NimoOriginator
 
- (NimoMemento *)createMemento
{
    NimoMemento *memento = [[NimoMemento alloc] initWithState:_state];
    return memento;
}
 
- (void)restoreMemento:(NimoMemento *)memento
{
    _state = memento.state;
}
 
- (NSString *)description
{
    return [NSString stringWithFormat:@"State:%@", _state];
}
 
@end

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

//備忘錄:負(fù)責(zé)存儲發(fā)起人對象的內(nèi)部狀態(tài),在需要的時候提供發(fā)起人需要的內(nèi)部狀態(tài)。
 
#import <Foundation/Foundation.h>
 
@interface NimoMemento : NSObject
 
@property (nonatomic, copy, readonly) NSString *state;
- (id)initWithState:(NSString *)state;
 
@end

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

#import "NimoMemento.h"
 
@interface NimoMemento()
 
@property (nonatomic, copy, readwrite) NSString *state;
 
 
@end

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

@implementation NimoMemento
 
- (id)initWithState:(NSString *)state
{
    if (self = [super init]) {
        _state = [state copy];
    }
    
    return self;
}
 
@end


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

//管理角色:對備忘錄進(jìn)行管理,保存和提供備忘錄。
 
#import <Foundation/Foundation.h>
@class NimoMemento;
 
@interface NimoCaretaker : NSObject
 
@property (nonatomic, assign) NimoMemento *memento;
 
@end

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

//
//  NimoCaretaker.m
//  MementoDemo
//

#import "NimoCaretaker.h"
 
@implementation NimoCaretaker
 
@end


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

Client:
 
#import <Foundation/Foundation.h>
#import "NimoOriginator.h"
#import "NimoMemento.h"
#import "NimoCaretaker.h"
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        NimoOriginator *originator = [[NimoOriginator alloc] init];
        originator.state = @"Old";
        NSLog(@"%@", originator);
        NimoMemento *memento = originator.createMemento;
        
        NimoCaretaker *caretaker = [[NimoCaretaker alloc] init];
        caretaker.memento = memento;
        originator.state = @"New";
        NSLog(@"%@", originator);
        
        [originator restoreMemento:[caretaker memento]];
        NSLog(@"%@", originator);
    }
    return 0;
}

運行:

2015-08-12 20:27:39.184 MementoDemo[1160:34914] State:Old
2015-08-12 20:27:39.186 MementoDemo[1160:34914] State:New
2015-08-12 20:27:39.186 MementoDemo[1160:34914] State:Old

以上通用代碼運行后雖然能得到期望的結(jié)果,但是并不完美,在Menmento類的實現(xiàn)中,我們把state屬性以及initWithState初始化方法暴露在了公共接口中,這兩者本應(yīng)只提供給Originator與Menmento(即對Originator與Menmento提供寬接口,對Caretaker等其他對象提供窄接口)。在C++等其他面向?qū)ο笳Z言中,一般使用private或friend進(jìn)行聲明。但在Objective-C中一切都是公有的,所以需要額外的技巧來實現(xiàn)。

通過類擴(kuò)展將state屬性以及initWithState初始化方法從主接口頭文件NimoMemento.h中分離:

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

//
//  NimoMemento+Private.h
//  MementoDemo
//
 
#import "NimoMemento.h"
 
@interface NimoMemento ()
 
@property (nonatomic, copy, readwrite) NSString *state;
- (id)initWithState:(NSString *)state;
 
@end

如此,只在Originator與Menmento中#import NimoMemento+Private.h,便實現(xiàn)了接口的私有化。

相關(guān)文章

  • Objective-C中NSLog輸出格式大全

    Objective-C中NSLog輸出格式大全

    這篇文章主要介紹了Objective-C中NSLog輸出格式的相關(guān)資料,非常的簡單,有需要的小伙伴可以參考下。
    2015-06-06
  • React Native搭建iOS開發(fā)環(huán)境

    React Native搭建iOS開發(fā)環(huán)境

    React Native的門檻不管是對于前端開發(fā)者還是移動端開發(fā)者來說都是很高的,既要懂原生又要懂js,技術(shù)棧是相當(dāng)長的。但是沒有關(guān)系,下面我們一步步來學(xué)習(xí),慢慢成長吧!
    2016-09-09
  • iOS開發(fā)之XLForm的使用方法

    iOS開發(fā)之XLForm的使用方法

    這篇文章主要介紹了iOS開發(fā)之XLForm的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 理解Objective-C的變量以及面相對象的繼承特性

    理解Objective-C的變量以及面相對象的繼承特性

    這篇文章主要介紹了理解Objective-C的變量以及面相對象的繼承特性,文中的所說的點語法即是'對象名.成員變量名'這種對變量的訪問,需要的朋友可以參考下
    2016-01-01
  • iOS Block解開多年以來一直的誤解

    iOS Block解開多年以來一直的誤解

    這篇文章主要給大家介紹了關(guān)于iOS Block多年以來一直的誤解如何解開的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • iOS實現(xiàn)百度外賣頭像波浪的效果

    iOS實現(xiàn)百度外賣頭像波浪的效果

    對于現(xiàn)在很多人來說,叫外賣就成了不可或缺的習(xí)慣。某日瞬間發(fā)現(xiàn)百度外賣的APP波浪效果很是吸引人,相比較其他的外賣APP,顏值略高些.(淘寶也有波浪的效果),遂就思考如何實現(xiàn)這種"浪"的效果,下面來一起看看。
    2016-08-08
  • IOS CocoaPods詳細(xì)使用方法

    IOS CocoaPods詳細(xì)使用方法

    自從有了CocoaPods以后,這些繁雜的工作就不再需要我們親力親為了,只需要我們做好少量的配置工作,CocoaPods會為我們做好一切
    2016-09-09
  • iOS實現(xiàn)微信朋友圈視頻截取功能

    iOS實現(xiàn)微信朋友圈視頻截取功能

    這篇文章主要介紹了iOS實現(xiàn)微信朋友圈視頻截取功能,微信使用非常普遍,功能也很強(qiáng)大,不知道大家對微信朋友圈視頻截取功能有沒有了解,下面腳本之家小編給大家?guī)碓斀饨榻B,感興趣的朋友一起看看吧
    2018-07-07
  • iOS項目開發(fā)--實現(xiàn)類似淘寶詳情頁面

    iOS項目開發(fā)--實現(xiàn)類似淘寶詳情頁面

    本篇文章主要介紹了iOS實現(xiàn)類似淘寶詳情頁面,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • iOS實現(xiàn)帶指引線的餅狀圖效果(不會重疊)

    iOS實現(xiàn)帶指引線的餅狀圖效果(不會重疊)

    餅狀圖對大家來說應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于iOS實現(xiàn)帶指引線的餅狀圖效果(不會重疊)的相關(guān)資料,文章通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04

最新評論

长兴县| 岳普湖县| 綦江县| 醴陵市| 虞城县| 锦屏县| 乌海市| 许昌市| 眉山市| 汉川市| 台湾省| 历史| 永靖县| 芜湖县| 吴川市| 新化县| 丰城市| 天水市| 白山市| 莎车县| 桐庐县| 宜川县| 门源| 横山县| 普安县| 会东县| 滨州市| 克东县| 元江| 咸宁市| 静安区| 小金县| 扎赉特旗| 中阳县| 布尔津县| 金沙县| 福安市| 乌拉特后旗| 濮阳县| 敖汉旗| 漳平市|