你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 設計形式中的Memento備忘錄形式的在iOS App開辟中的應用

設計形式中的Memento備忘錄形式的在iOS App開辟中的應用

編輯:IOS開發綜合

備忘錄形式。望文生義,備忘錄形式的初志就是為了前往上一個狀況而設計的。從名字看起來了如指掌,好吧,照樣老模樣,先給出界說。

備忘錄(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: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

以上通用代碼運轉後固然能獲得希冀的成果,然則其實不完善,在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,便完成了接口的公有化。

【設計形式中的Memento備忘錄形式的在iOS App開辟中的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved