iOS 디자인 모드 - 비망록 모드

비망록 모드: 패 키 징 을 파괴 하지 않 는 전제 에서 대상 의 내부 상 태 를 포착 하고 이 대상 외 에 이 상 태 를 저장 합 니 다.이렇게 하면 이 대상 을 원래 저 장 된 상태 로 복원 할 수 있다.
Originator (원 발 기): 현재 시간의 내부 상 태 를 기록 하고 백업 이 필요 한 상 태 를 정의 하 며 memento 를 만 드 는 것 을 책임 지고 memento 에서 상 태 를 회복 하 는 것 을 책임 집 니 다.
Memento (비망록): Originator 의 내부 상 태 를 저장 하고 필요 할 때 Originator 내부 상 태 를 제공 합 니 다.
Caretaker (관리인): Memento 를 안전 한 곳 에 보관 하고 추출 을 책임 집 니 다.
한 마디 로 요약: Originator 는 그 상 태 를 포함 하 는 Memento 를 만 들 고 Caretaker 에 게 보관 합 니 다. Caretaker 는 어떻게 Memento 와 상호작용 을 하 는 지 모 르 고 Memento 를 안전 한 곳 에 만 보관 합 니 다.
Objective - C 코드 구현:
Originator:
//
//  NimoOriginator.h
//  MementoDemo
//
//  Created by Tony on 15/8/12.
//  Copyright (c) 2015  NimoWorks. All rights reserved.
//
//   :           ,               ,            。

#import <Foundation/Foundation.h>
@class NimoMemento;

@interface NimoOriginator : NSObject

@property (nonatomic, copy) NSString* state;

- (NimoMemento *)createMemento;
- (void)restoreMemento:(NimoMemento *)memento;

@end
//
//  NimoOriginator.m
//  MementoDemo
//
//  Created by Tony on 15/8/12.
//  Copyright (c) 2015  NimoWorks. All rights reserved.
//

#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:
//
//  NimoMemento.h
//  MementoDemo
//
//  Created by Tony on 15/8/12.
//  Copyright (c) 2015  NimoWorks. All rights reserved.
//   :              ,                  。

#import <Foundation/Foundation.h>

@interface NimoMemento : NSObject

@property (nonatomic, copy, readonly) NSString *state;
- (id)initWithState:(NSString *)state;

@end
//
//  NimoMemento.m
//  MementoDemo
//
//  Created by Tony on 15/8/12.
//  Copyright (c) 2015  NimoWorks. All rights reserved.
//

#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:
//
//  NimoCaretaker.h
//  MementoDemo
//
//  Created by Tony on 15/8/12.
//  Copyright (c) 2015  NimoWorks. All rights reserved.
//    :        ,        。

#import <Foundation/Foundation.h>
@class NimoMemento;

@interface NimoCaretaker : NSObject

@property (nonatomic, assign) NimoMemento *memento;

@end
//
//  NimoCaretaker.m
//  MementoDemo
//
//  Created by Tony on 15/8/12.
//  Copyright (c) 2015  NimoWorks. All rights reserved.
//

#import "NimoCaretaker.h"

@implementation NimoCaretaker

@end

Client:
//
//  main.m
//  MementoDemo
//
//  Created by Tony on 15/8/12.
//  Copyright (c) 2015  NimoWorks. All rights reserved.
//

#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 속성 과 initWith State 초기 화 방법 을 공공 인터페이스 에 노출 시 켰 습 니 다. 이 두 가 지 는 Originator 와 Menmento (즉, Originator 와 Menmento 에 넓 은 인 터 페 이 스 를 제공 하고 Caretaker 등 다른 대상 에 게 좁은 인 터 페 이 스 를 제공 해 야 합 니 다).C + + 등 다른 대상 언어 에 서 는 일반적으로 private 나 friend 를 사용 하여 설명 합 니 다.그러나 오 브 젝 티 브 - C 에 서 는 모든 것 이 공유 되 기 때문에 추가 적 인 기술 이 필요 하 다.
클래스 확장 을 통 해 state 속성 및 initWithState 초기 화 방법 을 주 인터페이스 헤더 파일 NimoMemento. h 에서 분리 합 니 다.
//
//  NimoMemento+Private.h
//  MementoDemo
//
//  Created by Tony on 15/8/13.
//  Copyright (c) 2015  NimoWorks. All rights reserved.
//

#import "NimoMemento.h"

@interface NimoMemento ()

@property (nonatomic, copy, readwrite) NSString *state;
- (id)initWithState:(NSString *)state;

@end

이렇게 해서 Originator 와 Menmento 에서 만 \ # import NimoMemento + Private. h 인터페이스 의 사유 화 를 실현 합 니 다.

좋은 웹페이지 즐겨찾기