디자인 모드 에서 의 Memento 비망록 모드 의 iOS App 개발 에서 의 활용

6419 단어 디자인 모드iOS
비망록 모드.말 그대로 비망록 모델 의 취 지 는 이전 상태 로 돌아 가기 위해 설계 됐다.이름 에서 한눈 에 알 수 있 듯 이,좋아,그대로 야,먼저 정 의 를 내 려.
비망록(Memento):패 키 징 성 을 파괴 하지 않 는 전제 에서 대상 의 내부 상 태 를 포착 하고 이 대상 외 에 이 상 태 를 저장 합 니 다.이렇게 하면 이 대상 을 원래 저 장 된 상태 로 복원 할 수 있다.
정 의 는 매우 전문 적 으로 보이 지만 사실은 나중에 다시 사용 할 수 있 도록 이전 상 태 를 저장 하 는 것 이다.마치 게임 을 하 는 것 과 같다.보스 를 치기 전에 처음 이 안 될 까 봐 먼저 판 을 저장 하고 만약 에 게임 이 끝나 면 컨디션 을 회복 하고 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 속성 과 initWith State 초기 화 방법 을 공공 인터페이스 에 노출 시 켰 습 니 다.이 두 가 지 는 Originator 와 Menmento(즉,Originator 와 Menmento 에 넓 은 인 터 페 이 스 를 제공 하고 Caretaker 등 다른 대상 에 게 좁은 인 터 페 이 스 를 제공 해 야 합 니 다).C++등 다른 대상 언어 에 서 는 일반적으로 private 나 friend 를 사용 하여 설명 합 니 다.그러나 오 브 젝 티 브-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 인터페이스 의 사유 화 를 실현 합 니 다.

좋은 웹페이지 즐겨찾기