亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

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

2020-07-26 03:24:57
字體:
來源:轉載
供稿:網友

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

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

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

下面給出類結構圖。

2016323164621128.jpg (500×290)

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品av在线| 久久99精品国产99久久6尤物| 日韩在线视频免费观看| 精品视频www| 国产在线观看一区二区三区| 欧美激情国产日韩精品一区18| 欧美激情xxxxx| 亚洲福利在线视频| 亚洲精品久久久久久久久久久| 成人信息集中地欧美| 欧美视频中文字幕在线| 日本精品免费观看| 欧美激情va永久在线播放| 日韩中文字幕在线看| 国产精品女主播| 欧美激情欧美激情在线五月| 成人在线国产精品| 国产精品亚洲片夜色在线| 精品国产欧美一区二区五十路| 国产日韩av在线播放| 亚洲精品aⅴ中文字幕乱码| 成人午夜一级二级三级| 亚洲欧洲成视频免费观看| 欧美大片在线看免费观看| 亚洲乱码国产乱码精品精天堂| 久久久久久久久网站| 久久亚洲精品小早川怜子66| 久久人人看视频| 精品爽片免费看久久| 久久久精品国产网站| 亚洲欧美国产日韩中文字幕| 欧美三级欧美成人高清www| 热门国产精品亚洲第一区在线| 欧美日韩在线看| 国产午夜精品美女视频明星a级| 中文欧美日本在线资源| 亚洲精品videossex少妇| 中文字幕久精品免费视频| 日韩精品久久久久久久玫瑰园| 91中文在线视频| 久久精品国产欧美亚洲人人爽| 国产精品视频永久免费播放| 国产91精品久久久久久| 色偷偷偷亚洲综合网另类| 欧美在线亚洲在线| 欧美激情视频在线免费观看 欧美视频免费一| 久久久91精品国产一区不卡| 国产欧美日韩免费| 91亚洲精品久久久久久久久久久久| 91超碰中文字幕久久精品| 91亚洲国产成人久久精品网站| 一区二区三区视频免费在线观看| 日韩成人在线播放| 亚州av一区二区| 欧美限制级电影在线观看| 一区二区成人av| 欧美大片免费看| 亚洲欧美综合精品久久成人| 国产精品视频精品视频| 热久久免费视频精品| 色777狠狠综合秋免鲁丝| 中文字幕日韩电影| 亚洲成av人影院在线观看| 日本在线观看天堂男亚洲| 色婷婷综合久久久久中文字幕1| 欧美大肥婆大肥bbbbb| 国产精品影院在线观看| 亚洲成人免费网站| 亚洲激情国产精品| 在线电影中文日韩| 国产精品嫩草影院一区二区| 国内精品免费午夜毛片| 欧美肥老妇视频| 欧美日韩美女在线观看| 久久97久久97精品免视看| 日本精品视频在线观看| 国产精品视频专区| 成人字幕网zmw| 欧美成人合集magnet| 国产一区二区三区在线观看网站| 国产精品久久久久免费a∨| 97精品伊人久久久大香线蕉| 欧美精品第一页在线播放| 国产欧美精品va在线观看| 亚洲成人教育av| 久久久影视精品| 亚洲精品美女久久| 国产丝袜高跟一区| 欧美乱人伦中文字幕在线| 色综合老司机第九色激情| 黑丝美女久久久| 一区二区三区在线播放欧美| 亚洲已满18点击进入在线看片| 国产精品视频区| 亚洲欧美综合另类中字| 国产日韩换脸av一区在线观看| 日韩中文字幕亚洲| 亚洲一区美女视频在线观看免费| 97视频免费看| 茄子视频成人在线| 久久人人爽人人爽人人片av高清| 国产成人av网| 欧美一区第一页| 国产精品久久久久久久久久小说| 欧美性生交xxxxx久久久| 91精品国产高清久久久久久91| 日韩美女视频在线观看| 亚洲国产古装精品网站| 亚洲欧美精品伊人久久| 亚洲高清福利视频| 亚洲国产精品成人一区二区| 亚洲片在线资源| 久久精品影视伊人网| 久久久久久久久久久免费精品| 欧美亚洲另类制服自拍| 日韩欧美在线国产| 亚洲色图偷窥自拍| 日韩经典中文字幕| 亚洲日韩中文字幕| 九色成人免费视频| 中文字幕日韩欧美精品在线观看| 欧美精品国产精品日韩精品| 国产精品免费久久久久久| 久久精品视频网站| 欧美激情视频一区二区| 国产亚洲欧洲在线| 久久人91精品久久久久久不卡| 98精品在线视频| 久久91超碰青草是什么| 亚洲精品v欧美精品v日韩精品| 国产精品久久在线观看| 一区二区在线免费视频| 久久久亚洲成人| 亚洲一级片在线看| 国产精品视频一区二区三区四| 欧美插天视频在线播放| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲伦理中文字幕| 精品久久久91| 国产成人一区二区三区小说| 91视频九色网站| 国产欧美精品在线| 日韩免费在线免费观看| 欧美日韩精品在线视频| 正在播放国产一区| 欧美激情xxxx| 中文字幕精品av| 欧美亚洲另类制服自拍| 91香蕉嫩草影院入口| 亚洲精品国产美女| 国产精品自拍网| 亚洲男人天堂网站| 亚洲精品videossex少妇| 成人国产亚洲精品a区天堂华泰| 欧美精品在线免费| 日韩一区视频在线| 国产精品爽黄69| 欧美韩日一区二区| 国产精品久久久久久av福利| 国产日韩欧美91| 国产成人精品免费久久久久| 亚洲国产精品久久久久秋霞蜜臀| 日韩性xxxx爱| 日韩大片免费观看视频播放|