IOS设计模式-备忘录模式

一、如何存储记录git

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

一、存储记录的必要性设计模式

生活中,好比去超市购物有时候就须要在入口储物柜存放本身的包裹安全

二、记录的惟一标示工具

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

三、存储记录与取出记录优化

===============================================================================================网站


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

 

备忘录模式的UML图:设计

 

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

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的内容进行访问或者操做。


三、使用备忘录模式

开始上代码 :



为何存储一个对象的状态只须要存储这个对象的属性便可?


  一个对象是由属性和方法组成的。在对象的生命周期中,从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

四、优化存储方案

 

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


测试代码:


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

五、恢复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

  (以前的没有问题,只是有方法用词不对,我这里仅仅是更改了方法名用词)

相关文章
相关标签/搜索