内容大纲

  • 如何存储记录
  • 备忘录模式的基本原理
  • 使用备忘录模式
  • 优化存储方案
  • 恢复UIView的状态

1、如何存储记录

在存储记录时,第一步我们需要用一把钥匙去打开一把锁。第二步,当我们打开锁之后就会有黑盒子,我们一开始还不知道里面有什么,所以是黑盒子。

1、存储记录的必要性

生活中,比如去超市购物有时候就需要在入口储物柜存放自己的包裹

2、记录的唯一标示

储物柜对应一把钥匙和号码标示。

3、存储记录与取出记录

===============================================================================================

根据上面的思维导图:备忘录模式有:1.有key值(唯一标示符) 2.获取与key对应的存储物品 3.可以存储多样性的对象。

备忘录模式的UML图:

2、备忘录模式的基本原理

Originator起因;起源;创作者;发起人,对象:能够生成备忘录中心的状态值 Memento纪念品,记录,备忘录中心,能够将对象生成的备忘录中的状态值进行存储或者取出值 Caretaker看门人,备忘录中心存在黑箱子里的物品

  设计存储中心,比如超市里的储物柜
  指定存储接口,
  实现存储机制,
备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。
定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
涉及角色:
1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。
Originator可以根据需要决定Memento存储自己的哪些内部状态。
2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。
备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。
Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。

3、使用备忘录模式

开始上代码 :
为什么存储一个对象的状态只需要存储这个对象的属性即可?   一个对象是由属性和方法组成的。在对象的生命周期中,从alloc-init创建到销毁,会不断变化的是属性,而行为方法仍旧还是那个行为方法。
    (如果对象的方法要变,比如将飞鸟的“飞”的行为变成“游泳”,那也只能更改创建这个对象的类对应的方法,注意哦,
      是通过改变类的方法而改变这个对象的方法哦,除此之外,正在活动的对象方法是不可能改变的。)   那么属性呢?属性肯定会变的,更何况如果销毁了一个对象,重新alloc-init方法出来的新的对象的属性肯定是和前一个对象不一样。   所以综上所述,要保存一个对象,一般只要保存这个对象的属性状态即可。
  最后,OC一般用字典来保存对象的属性状态("属性-值:key-value""字典的键-值对:key-value")。 接着新建一个普通的Apple类,模拟需要存储的对象,接收协议实现相关的方法。

然后拷贝Fastcoding源码进工程。 到这里的源代码百度云下载链接: http://pan.baidu.com/s/1gekVZmN 密码: xcvs (该工程里的Fastcoding已经设置好了MRC模式)

另外介绍:FastCoding(第三方序列化对象工具)

  1.定义: 本地序列化工具 
  2.优点: 普通对象直接转换成NSData,直接存储,效率高于NSCoding,编码也比NSCoding好用
  3.缺点:项目ARC,Fastcoding(MRC)
  4.使用条件:MRC(需要用-fno-objc-arc)

在github网站里https://github.com/nicklockwood/FastCoding,可以下载到FastCoding源码,然后拷贝进工程,最后设置好MRC即可。


为了方法实现严谨和安全,在代码中使用NSParameterAssert(object); ,如果object为nil,那么这段程序就会直接使得整个应用程序崩溃。

并在MetentoCenter中使用Fastcoding和NSUserDefaults:

然后测试:

先使用MetentoCenter存储状态:

然后通过MetentoCenter读取存储的状态:

到这里为止,源代码百度云下载链接: http://pan.baidu.com/s/1kTXWCAj 密码: pfd9

4、优化存储方案

优化开始,创建一个NSObject的类别:

测试代码:

该源代码"终结版"百度下载链接: http://pan.baidu.com/s/1jGWCK9C 密码: 7hdg

5、恢复UIView的状态

 之前备忘录的源代码中MetentoCenter是完全可复用的,所以直接提出来放在一个文件夹里,并且备份在百度云链接: http://pan.baidu.com/s/1ntRMVtZ 密码: n94v
 
下载之后,使用方法示例:
 
然后就可以为这个继承自UIView的子类HYView进行状态属性的备份。比如,我这里示例备份其frame属性:
 
 那么还要实现遵循协议里的方法:
 
接下来就直接进行测试代码,记得在使用的地方要导入MetentoCenter的类别:
 
 
 这部分的源代码百度云链接: http://pan.baidu.com/s/1sk16B7Z 密码: bs89
 
这里重写更新一下MetentoCenter封装好的可复用的源代码百度云链接: http://pan.baidu.com/s/1qXsfnBm 密码: pay4
  (之前的没有问题,只是有方法用词不对,我这里仅仅是更改了方法名用词)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

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

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

  2. iOS设计模式 - 备忘录

    iOS设计模式 - 备忘录 原理图 说明 1. 在不破坏封装的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态 2. 本人已经将创建状态与恢复状态 ...

  3. Java设计模式—备忘录模式

    个人感觉备忘录模式是一个比较难的设计模式,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法. 定义如下:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以 ...

  4. JAVA 设计模式 备忘录模式

    用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构

  5. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  6. 深入浅出设计模式——备忘录模式(Memento Pattern)

    模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取 ...

  7. PHP设计模式——备忘录模式

    声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...

  8. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

  9. C++设计模式——备忘录模式

    备忘录模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢 ...

随机推荐

  1. php -- strstr()字符串匹配函数(备忘)

    Learn From: http://blog.csdn.net/morley_wang/article/details/7859922 strstr(string,search) strstr() ...

  2. 红黑树(三)之 Linux内核中红黑树的经典实现

    概要 前面分别介绍了红黑树的理论知识 以及 通过C语言实现了红黑树.本章继续会红黑树进行介绍,下面将Linux 内核中的红黑树单独移植出来进行测试验证.若读者对红黑树的理论知识不熟悉,建立先学习红黑树 ...

  3. Hadoop入门进阶课程6--MapReduce应用案例

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  4. PintJS – 轻量,并发的 GruntJS 运行器

    PintJS 是一个小型.异步的 GruntJS 运行器,试图解决大规模构建流程中的一些问题. 典型的Gruntfile 会包括 jsHint,jasmine,LESS,handlebars, ugl ...

  5. 免费下载!Twitter Bootstrap V3 矢量界面素材

    Bootstrap 3 Vector UI Kit 包含所有矢量格式的 Twitter Bootstrap 3 界面控制元素.Glyphicons 以及额外的一些界面素材,而且基本的图形元素都切好图了 ...

  6. LeetCode——Jump Game

    Description: Given an array of non-negative integers, you are initially positioned at the first inde ...

  7. 工作流数据库表设计-ASP.NET

    公司准备开发一套工作流引擎,以前没有什么OA开发经验,也是第一次设计工作流引擎,我把我的一些思路分享一下,希望得到些帮助或者能帮助到一些人. 产品的定位: 1.能够做到前后端分离 2.可以做到项目的分 ...

  8. ASP.NETC#通用扩展函数之TypeParse 类型转换方便多了

    用法: var int1 = "2".TryToInt();//转换为int失败返回0 var int2 = "2x".TryToInt(); var int3 ...

  9. Mysql的NULL的一个注意点

    今天看到一个问题: select a.* from a where (a.id not in (NULL)); 这个sql语句会返回什么? 刚开始以为是返回所有item,但是实际运行下返回是返回emp ...

  10. poi中getPhysicalNumberOfRows()和getLastRowNum()区别

    getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况. getLastRowNum()获取的是最后一行的编号(编号从0开始). 通过getPhysic ...