您的位置:首页 > 移动开发 > IOS开发

iOS设计模式---备忘录模式

2015-08-13 00:37 387 查看
备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

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属性以及initWithState初始化方法暴露在了公共接口中,这两者本应只提供给Originator与Menmento(即对Originator与Menmento提供宽接口,对Caretaker等其他对象提供窄接口)。在C++等其他面向对象语言中,一般使用private或friend进行声明。但在Objective-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,便实现了接口的私有化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: