IOS设计模式-备忘录模式
内容大纲
- 如何存储记录
- 备忘录模式的基本原理
- 使用备忘录模式
- 优化存储方案
- 恢复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的状态





IOS设计模式-备忘录模式的更多相关文章
- [转] Android中的设计模式-备忘录模式
转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫 ...
- iOS设计模式 - 备忘录
iOS设计模式 - 备忘录 原理图 说明 1. 在不破坏封装的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态 2. 本人已经将创建状态与恢复状态 ...
- Java设计模式—备忘录模式
个人感觉备忘录模式是一个比较难的设计模式,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法. 定义如下:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以 ...
- JAVA 设计模式 备忘录模式
用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构
- [工作中的设计模式]备忘录模式memento
一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...
- 深入浅出设计模式——备忘录模式(Memento Pattern)
模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取 ...
- PHP设计模式——备忘录模式
声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...
- java设计模式---备忘录模式
一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...
- C++设计模式——备忘录模式
备忘录模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢 ...
随机推荐
- 爬虫技术 -- 进阶学习(九)使用HtmlAgilityPack获取页面链接(附c#代码及插件下载)
菜鸟HtmlAgilityPack初体验...弱弱的代码... Html Agility Pack是一个开源项目,为网页提供了标准的DOM API和XPath导航.使用WebBrowser和HttpW ...
- C#加密类
var es= EncryptSugar.GetInstance(); string word = "abc"; var wordEncrypt = es.Encrypto(wor ...
- 浅谈mysql的两阶段提交协议
前两天和百度的一个同学聊MySQL两阶段提交,当时自信满满的说了一堆,后来发现还是有些问题的理解还是比较模糊,可能是因为时间太久了,忘记了吧.这里再补一下:) 5.3.1事务提交流程 MySQL的事务 ...
- JavaScript 按值传递 & 按引用传递
(1)值的比较--引用的比较 首先,原始值的比较是值的比较:只有在它们值相等的时候它们才相等 比如简单的 var a1 = 10; var a2 = 10; console.log(a1 === a2 ...
- AccessHelper
代码: using System; using System.Data; using System.Configuration; using System.Data.OleDb; using ahwi ...
- JavaScrip的DOM操作
1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型,文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西 2.Windows对象操作 一.属性和方法 二.Window.open(& ...
- 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子
客户端:先创建一个winform窗体的应用程序项目 项目结构
- csharp: InvokeHelper
Entity Framework https://entityframework.codeplex.com/ Enterprise Library https://entlib.codeplex.co ...
- urllib库初体验以及中文编码问题的探讨
提出问题:如何简单抓取一个网页的源码 解决方法:利用urllib库,抓取一个网页的源代码 ------------------------------------------------------- ...
- Linux Shell系列教程之(十二)Shell until循环
本文是Linux Shell系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环和Lin ...