国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

設計模式中的Memento備忘錄模式的在iOS App開發中的運用

2019-10-21 18:55:25
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了設計模式中的Memento備忘錄模式的在iOS App開發中的運用,Memento著重于捕獲和具體化當前對象的內部狀態,需要的朋友可以參考下
 

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

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

定義看起來搞的很專業,其實就是保存上一個狀態,以便日后恢復用。好比是在玩游戲,在打大Boss之前擔心第一次打不過,先存個盤,萬一玩兒完了,還可以恢復狀態重新PK。

下面給出類結構圖。

設計模式,Memento,iOS,App開發

Originator(原發器):記錄當前時刻的內部狀態,負責定義哪些屬于需要備份的狀態,負責創建memento,負責從memento恢復狀態。

Memento(備忘錄):負責存儲Originator的內部狀態,在需要時提供給Originator內部狀態。

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

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

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

Objective-C代碼實現:

Originator:

復制代碼代碼如下:

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

復制代碼代碼如下:

#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:
復制代碼代碼如下:

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

復制代碼代碼如下:

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

復制代碼代碼如下:

 

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


Caretaker:
復制代碼代碼如下:

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

復制代碼代碼如下:

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

 

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


復制代碼代碼如下:

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:Old2015-08-12 20:27:39.186 MementoDemo[1160:34914] State:New2015-08-12 20:27:39.186 MementoDemo[1160:34914] State:Old

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

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

復制代碼代碼如下:

//
//  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,便實現了接口的私有化。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 周至县| 双牌县| 汾西县| 咸阳市| 甘洛县| 五莲县| 扶沟县| 嘉善县| 镇康县| 栾川县| 西安市| 湾仔区| 洪洞县| 舟山市| 林口县| 邢台市| 隆林| 昆明市| 望城县| 安徽省| 扎赉特旗| 文化| 徐闻县| 晋州市| 沈丘县| 康马县| 彰武县| 华蓥市| 玉山县| 阳东县| 梅州市| 明水县| 通海县| 滦南县| 濮阳县| 宜春市| 龙江县| 琼结县| 金溪县| 梁河县| 黄浦区|