备忘录模式:在不破坏封装前提条件下,捕获一个对象的内部状态,在对象之外,保存状态,以便在适当的时候恢复对象,
应用实例:
1、玩游戏时的存档
2、Command + z
example:
Originator 发起请求将需要保存的信息保存到Memento(备忘录)中,然后将对象提交到Caretaker实例保管
类图:
具体实现:
#import <iostream>
#import <string>
#import <vector>
#import <Foundation/Foundation.h>
#import "Person.h"
//真正保存对象状态的类(备忘录)
class Memento{
private:
std::string _state;
public:
Memento(std::string state){
_state = state;
}
std::string getState(){
return _state;
}
};
//原发器构造将状态保存到备忘录中
class Originator{
public:
Memento* saveStateToMemento(std::string state){
return new Memento(state);
}
std::string getStateFromMemento(Memento* memento){
return memento -> getState();
}
};
//看管人负责将备忘录放到安全之处保管,目前放到vector
class CareTaker{
private:
std::vector<Memento*> _vector;
public:
//保存备忘录
void add(Memento* memento){
_vector.push_back(memento);
}
//获取备忘录
Memento* get(int index){
if (index >= _vector.size()){
return NULL;
}
return _vector.at(index);
}
};
//client 充当客户端
int main(int argc, const char * argv[]) {
// insert code here...
CareTaker* taker = new CareTaker();
Originator* orginator = new Originator();
taker -> add(orginator -> saveStateToMemento("state1"));
taker -> add(orginator -> saveStateToMemento("state2"));
taker -> add(orginator -> saveStateToMemento("state3"));
taker -> add(orginator -> saveStateToMemento("state4"));
std::cout << "获取第四次保存的状态:" << orginator -> getStateFromMemento(taker -> get(3)) << std::endl;
//Objective-C:
//对应iOS 归档,接档,属性列表序列化和核心数据中
Person* person = [Person new];
person.age = 23;
person.name = @"123";
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:person requiringSecureCoding:YES error:nil];
NSError* error;
Person* unarchivePerson = [NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:data error:&error];
NSLog(@"Objective-C 解档后的数据 name:%@,age:%d",unarchivePerson.name,unarchivePerson.age);
return 0;
}
Person.h:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject<NSCoding,NSSecureCoding>
@property(nonatomic,assign) int age;
@property(nonatomic,copy) NSString* name;
@end
NS_ASSUME_NONNULL_END
Person.mm:
#import "Person.h"
@interface Person()
@end
@implementation Person
- (void)encodeWithCoder:(NSCoder *)coder{
[coder encodeInt:_age forKey:@"age"];
[coder encodeObject:_name forKey:@"name"];
}
- (nullable instancetype)initWithCoder:(NSCoder *)coder{
if (self = [super init]) {
_age = [coder decodeIntForKey:@"age"];
_name = [coder decodeObjectForKey:@"name"];
}
return self;
}
+ (BOOL)supportsSecureCoding{
return YES;
}
@end
输出结果: