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

  • 相关阅读:
    find指令使用手册
    IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式
    Vmare虚拟机中的3种网络连接方式
    Windows10下Apache2.4配置Django
    网站配色
    js 图片轮播
    Window10下Apache2.4的安装和运行
    sqlite数据库转换为mysql数据库
    windows10 安装 mysql 5.6 教程
    win10 nginx + django +flup 配置
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4802139.html
Copyright © 2011-2022 走看看