디자인 모드 에서 의 Memento 비망록 모드 의 iOS App 개발 에서 의 활용
비망록(Memento):패 키 징 성 을 파괴 하지 않 는 전제 에서 대상 의 내부 상 태 를 포착 하고 이 대상 외 에 이 상 태 를 저장 합 니 다.이렇게 하면 이 대상 을 원래 저 장 된 상태 로 복원 할 수 있다.
정 의 는 매우 전문 적 으로 보이 지만 사실은 나중에 다시 사용 할 수 있 도록 이전 상 태 를 저장 하 는 것 이다.마치 게임 을 하 는 것 과 같다.보스 를 치기 전에 처음 이 안 될 까 봐 먼저 판 을 저장 하고 만약 에 게임 이 끝나 면 컨디션 을 회복 하고 PK 를 다시 할 수 있다.
다음은 클래스 구성 도 를 드 리 겠 습 니 다.
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 인터페이스 의 사유 화 를 실현 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.