码迷,mamicode.com
首页 > 移动开发 > 详细

iOS设计模式 - 备忘录

时间:2015-09-11 22:11:48      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:

iOS设计模式 - 备忘录

技术分享

 

原理图

技术分享

 

说明

1. 在不破坏封装的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态

2. 本人已经将创建状态与恢复状态的逻辑抽象成了协议,并配合备忘录中心一起使用

 

源码

https://github.com/YouXianMing/MementoPattern

//
//  MementoCenter.h
//  MementoPattern
//
//  Created by YouXianMing on 15/9/11.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MementoCenterProtocol.h"

@interface MementoCenter : NSObject

/**
 *  存储备忘录对象
 *
 *  @param mementoObject 备忘录对象
 *  @param key           标记对象的键值
 */
+ (void)saveMementoObject:(id <MementoCenterProtocol>)mementoObject withKey:(NSString *)key;

/**
 *  获取备忘录对象
 *
 *  @param key 标记对象的键值
 *
 *  @return 备忘录对象
 */
+ (id)mementoObjectWithKey:(NSString *)key;

@end
//
//  MementoCenter.m
//  MementoPattern
//
//  Created by YouXianMing on 15/9/11.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "MementoCenter.h"
#import "FastCoder.h"
#import <CommonCrypto/CommonDigest.h>

@implementation MementoCenter

+ (void)saveMementoObject:(id <MementoCenterProtocol>)mementoObject withKey:(NSString *)key {

    NSParameterAssert(mementoObject);
    NSParameterAssert(key);
    
    NSData *data = [self makeDataWithValue:[mementoObject currentState]];
    
    if (data) {
    
        [self storeValue:data with:[self MD5HashWithString:key]];
    }
}

+ (id)mementoObjectWithKey:(NSString *)key {

    NSParameterAssert(key);

    NSData *data = [self valueWithKey:[self MD5HashWithString:key]];
    
    if (data) {
        
        return [self makeObjectWithData:data];
        
    } else {
    
        return nil;
    }
}

#pragma mark - md5
+ (NSString *)MD5HashWithString:(NSString *)string {
    
    CC_MD5_CTX md5;
    
    CC_MD5_Init(&md5);
    CC_MD5_Update(&md5, [string UTF8String], (CC_LONG) [string length]);
    
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final(digest, &md5);
    
    NSString *s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                   digest[0],  digest[1],
                   digest[2],  digest[3],
                   digest[4],  digest[5],
                   digest[6],  digest[7],
                   digest[8],  digest[9],
                   digest[10], digest[11],
                   digest[12], digest[13],
                   digest[14], digest[15]];
    
    return s;
}

#pragma mark - 本地持久化
+ (void)storeValue:(id)value with:(NSString *)key {
    [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
}

+ (id)valueWithKey:(NSString *)key {
    return [[NSUserDefaults standardUserDefaults] objectForKey:key];
}

#pragma mark - 使用FastCode来处理对象
+ (NSData *)makeDataWithValue:(id)value {
    return [FastCoder dataWithRootObject:value];
}

+ (id)makeObjectWithData:(NSData *)data {
    return [FastCoder objectWithData:data];
}

@end
//
//  MementoCenterProtocol.h
//  MementoPattern
//
//  Created by YouXianMing on 15/9/11.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol MementoCenterProtocol <NSObject>

@required
/**
 *  生成当前状态对象值
 *
 *  @return 对象值
 */
- (id)currentState;

/**
 *  恢复到指定的状态
 *
 *  @param state 状态
 */
- (void)recoverFromState:(id)state;

@end

 

分析

使用FastCoder来作为存储工具

技术分享

 

iOS设计模式 - 备忘录

标签:

原文地址:http://www.cnblogs.com/YouXianMing/p/4802139.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!