iOS设计模式 - 备忘录

简介:

iOS设计模式 - 备忘录

 

原理图

 

说明

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

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

 

源码

https://github.com/YouXianMing/iOS-Design-Patterns


//
//  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来作为存储工具

 


目录
相关文章
|
7月前
|
设计模式 测试技术 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
232 0
|
7月前
|
设计模式 搜索推荐 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
503 1
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
|
7月前
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
269 0
|
7月前
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
406 0
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
|
7月前
|
设计模式 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)
247 0
|
7月前
|
设计模式 iOS开发 UED
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)
248 0
|
7月前
|
设计模式 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
242 0
|
9月前
|
设计模式 数据库 Windows
备忘录设计模式解读
备忘录设计模式解读
|
11月前
|
机器学习/深度学习 缓存 自然语言处理
谷歌Recorder实现说话人自动标注,功能性与iOS语音备忘录再度拉大
谷歌Recorder实现说话人自动标注,功能性与iOS语音备忘录再度拉大
|
设计模式 测试技术 API
淘宝iOS扫一扫架构升级 - 设计模式的应用
本文在“扫一扫功能的不断迭代,基于设计模式的基本原则,逐步采用设计模式思想进行代码和架构优化”的背景下,对设计模式在扫一扫中新的应用进行了总结。
184 0
淘宝iOS扫一扫架构升级 - 设计模式的应用