zoukankan      html  css  js  c++  java
  • 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来作为存储工具

  • 相关阅读:
    有固态硬盘的电脑还是不流畅?这些值得了解
    一名神舟笔记本电脑用户的内心独白
    验证码无法显示:Could not initialize class sun.awt.X11GraphicsEnvironment 解决方案
    nginx 负载均衡时,一台tomcat宕机时的问题 自动切换
    tomcat结合nginx使用小结
    金九银十面试突击,卧底去阿里、京东、美团、腾讯带回来的面试题(内含答案)
    干货分享 ▏Jmeter-场景设置/运行/参数化访问地址/【一次性打包呈现】
    各类APP功能测试用例/设计方法/数据库和日记分析——【范本】
    软件测试这些坑,千万不要踩!
    技术面试中,遇到不会回答的问题怎么破?来,教3招!
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4802139.html
Copyright © 2011-2022 走看看