iOS设计模式 - 备忘录

原理图

说明

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

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

源码

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

  1. //
  2. // MementoCenter.h
  3. // MementoPattern
  4. //
  5. // Created by YouXianMing on 15/9/11.
  6. // Copyright (c) 2015年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10. #import "MementoCenterProtocol.h"
  11.  
  12. @interface MementoCenter : NSObject
  13.  
  14. /**
  15. * 存储备忘录对象
  16. *
  17. * @param mementoObject 备忘录对象
  18. * @param key 标记对象的键值
  19. */
  20. + (void)saveMementoObject:(id <MementoCenterProtocol>)mementoObject withKey:(NSString *)key;
  21.  
  22. /**
  23. * 获取备忘录对象
  24. *
  25. * @param key 标记对象的键值
  26. *
  27. * @return 备忘录对象
  28. */
  29. + (id)mementoObjectWithKey:(NSString *)key;
  30.  
  31. @end
  1. //
  2. // MementoCenter.m
  3. // MementoPattern
  4. //
  5. // Created by YouXianMing on 15/9/11.
  6. // Copyright (c) 2015年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import "MementoCenter.h"
  10. #import "FastCoder.h"
  11. #import <CommonCrypto/CommonDigest.h>
  12.  
  13. @implementation MementoCenter
  14.  
  15. + (void)saveMementoObject:(id <MementoCenterProtocol>)mementoObject withKey:(NSString *)key {
  16.  
  17. NSParameterAssert(mementoObject);
  18. NSParameterAssert(key);
  19.  
  20. NSData *data = [self makeDataWithValue:[mementoObject currentState]];
  21.  
  22. if (data) {
  23.  
  24. [self storeValue:data with:[self MD5HashWithString:key]];
  25. }
  26. }
  27.  
  28. + (id)mementoObjectWithKey:(NSString *)key {
  29.  
  30. NSParameterAssert(key);
  31.  
  32. NSData *data = [self valueWithKey:[self MD5HashWithString:key]];
  33.  
  34. if (data) {
  35.  
  36. return [self makeObjectWithData:data];
  37.  
  38. } else {
  39.  
  40. return nil;
  41. }
  42. }
  43.  
  44. #pragma mark - md5
  45. + (NSString *)MD5HashWithString:(NSString *)string {
  46.  
  47. CC_MD5_CTX md5;
  48.  
  49. CC_MD5_Init(&md5);
  50. CC_MD5_Update(&md5, [string UTF8String], (CC_LONG) [string length]);
  51.  
  52. unsigned char digest[CC_MD5_DIGEST_LENGTH];
  53. CC_MD5_Final(digest, &md5);
  54.  
  55. NSString *s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
  56. digest[], digest[],
  57. digest[], digest[],
  58. digest[], digest[],
  59. digest[], digest[],
  60. digest[], digest[],
  61. digest[], digest[],
  62. digest[], digest[],
  63. digest[], digest[]];
  64.  
  65. return s;
  66. }
  67.  
  68. #pragma mark - 本地持久化
  69. + (void)storeValue:(id)value with:(NSString *)key {
  70. [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
  71. }
  72.  
  73. + (id)valueWithKey:(NSString *)key {
  74. return [[NSUserDefaults standardUserDefaults] objectForKey:key];
  75. }
  76.  
  77. #pragma mark - 使用FastCode来处理对象
  78. + (NSData *)makeDataWithValue:(id)value {
  79. return [FastCoder dataWithRootObject:value];
  80. }
  81.  
  82. + (id)makeObjectWithData:(NSData *)data {
  83. return [FastCoder objectWithData:data];
  84. }
  85.  
  86. @end
  1. //
  2. // MementoCenterProtocol.h
  3. // MementoPattern
  4. //
  5. // Created by YouXianMing on 15/9/11.
  6. // Copyright (c) 2015年 YouXianMing. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. @protocol MementoCenterProtocol <NSObject>
  12.  
  13. @required
  14. /**
  15. * 生成当前状态对象值
  16. *
  17. * @return 对象值
  18. */
  19. - (id)currentState;
  20.  
  21. /**
  22. * 恢复到指定的状态
  23. *
  24. * @param state 状态
  25. */
  26. - (void)recoverFromState:(id)state;
  27.  
  28. @end

分析

使用FastCoder来作为存储工具

iOS设计模式 - 备忘录的更多相关文章

  1. IOS设计模式-备忘录模式

    内容大纲 如何存储记录 备忘录模式的基本原理 使用备忘录模式 优化存储方案 恢复UIView的状态 1.如何存储记录 在存储记录时,第一步我们需要用一把钥匙去打开一把锁.第二步,当我们打开锁之后就会有 ...

  2. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  3. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  4. iOS 设计模式

    很赞的总结 iOS Design Patterns 中文版 IOS设计模式之一(MVC模式,单例模式) IOS设计模式之二(门面模式,装饰器模式) IOS设计模式之三(适配器模式,观察者模式) IOS ...

  5. iOS设计模式 - (1)概述

    近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...

  6. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  7. iOS设计模式之生成器

    iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得相同的构建过程能够创建不同的表示 (2): 生成器模式除了客户之外还包括一个Director(指导者) ...

  8. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

  9. [转] Android中的设计模式-备忘录模式

    转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫 ...

随机推荐

  1. WPF的ControlTemplate和DataTemplate简介

    首先理清几个概念,Template.ControlTemplate.ContentTemplate.DataTemplate.ContentControl 这几个东西名字都差不多,意思感觉也接近,初次 ...

  2. import.html 页面导出execl

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. GDI+中发生一般性错误的解决办法(转)

    今天在开发.net引用程序中,需要System.Drawing.Image.Save 创建图片,debug的时候程序一切正常,可是发布到IIS后缺提示出现"GDI+中发生一般性错误" ...

  4. 使用JS导出页面内容到Excel

    JS代码 <script> $(function(){ // 使用outerHTML属性获取整个table元素的HTML代码(包括<table>标签),然后包装成一个完整的HT ...

  5. .net面试题[转载]

    1.简述private.protected.public.internal修饰符的访问权限. private:私有成员,在类的内部才可以访问. protected:保护成员,该类内部和继承类中可以访问 ...

  6. Jsp&Servlet入门级项目全程实录第5讲

    惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 1.修改功能实现 dao public int gradeAdd(Connection con,Grade grade ...

  7. 手把手教你写一个java的orm(五)

    生成sql:where 上一篇里我们实现了生成insert的sql,下面要开始实现update,delete,select的sql语句了.但是这些语句有一个比较麻烦的地方是:它们一般后面都会有wher ...

  8. Linux 添加定时任务,crontab -e 命令与直接编辑 /etc/crontab 文件

    1. 使用 crontab -e 命令编辑定时任务列表 使用这个命令编辑的定时任务列表是属于用户级别的,初次编辑后在 /var/spool/cron 目录下生成一个与用户名相同的文件,文件内容就是我们 ...

  9. gRPC 的 RoadMap 20151022 更新

    gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发 ...

  10. [Clojure] 包管理器leiningen配置国内镜像仓库

    clojure用到的包管理站主要有两个,一个是解决java类库依赖的maven,一个是clojar 很多人都知道maven有阿里云提供的镜像站,可是clojar呢?幸运的是中科大为我们提供了cloja ...