内容大纲

  • 如何存储记录
  • 备忘录模式的基本原理
  • 使用备忘录模式
  • 优化存储方案
  • 恢复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
(之前的没有问题,只是有方法用词不对,我这里仅仅是更改了方法名用词)

转载于:https://www.cnblogs.com/goodboy-heyang/p/5041523.html

IOS设计模式-备忘录模式相关推荐

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

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态. 保存的是状态而不是对象本身. 一.使用步骤 二.基本属性 三.代码示例 1.备忘录 ...

  2. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  3. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  4. iOS设计模式 - 备忘录

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

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

    Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...

  6. 设计模式-备忘录模式(Memento)-Java

    设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...

  7. C++设计模式——备忘录模式(memento pattern)

    博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可 ...

  8. 移动开发之设计模式- 备忘录模式(IOSAndroid)

    资源 完全参照备忘录模式|菜鸟模式但不包括IOS代码 备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图: ...

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

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

最新文章

  1. CCSP-防火墙学习笔记第6章
  2. Git 配置命令设置
  3. python——杂货铺
  4. 哎!又要过年了,程序员最怕问到什么?
  5. 神舟笔记本bios_海尔雷神(蓝天)神舟战神游戏本风扇狂转掉电大写灯狂闪维修实例...
  6. SQL Server:简繁转换
  7. 耿丹16-1第一次作业
  8. 微软程骉:智能医疗产业化应用的挑战和解决之道
  9. android js 子线程,Android学习笔记:Android中的线程:MainThread 和 WorkerThread
  10. 程序设计语言的基本概念
  11. 史上最全Java学习资料,共14W字,耗时半年整理
  12. 示波器的带宽对信号的影响
  13. 12306购票辅助工具
  14. 我的世界php motd,我的世界防压测插件 MOTD压测防御
  15. optuna-自动化调参利器
  16. 移动宽带套餐介绍_移动宽带一年多少钱 2018移动宽带套餐介绍
  17. PHP出现中文乱码的解决方法
  18. f49.in index.php,国家语言,语言代码,locale id对应表
  19. 如何将RTOS系统启动时间做到“毫秒级”?AliOS Things是这样做的
  20. 白话中台战略2:中台到底长啥样?

热门文章

  1. html标签语法结构,html dl标签语法结构与使用
  2. 隐藏文件无法取消隐藏属性的解决[转]
  3. 前端代码开发规范总结
  4. 天天当键盘侠,你知道从按键到响应的底层原理吗?
  5. 风变编程python小课怎么样_风变编程Python小课最近很火,大家学完感受如何?
  6. DNP开发出用于半导体封装的TGV玻璃芯基材
  7. linux vim保存退出命令
  8. 多元统计分析 || 试按组距为300计算频数、频率和累计频率,并绘制直方图
  9. 计算机基础知识之二进制乘法
  10. U盘启动安装linux服务器(附带ULtraISO工具下载地址和注册码)