备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
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,便实现了接口的私有化。
时间: 2025-01-02 06:06:46