zoukankan      html  css  js  c++  java
  • 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的状态

     之前备忘录的源代码中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
      (之前的没有问题,只是有方法用词不对,我这里仅仅是更改了方法名用词)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    kettle imestamp : Unable to get timestamp from resultset at index 22
    ImportError: No module named setuptools 解决方案
    Tesseract-OCR
    python截图
    connect to SQL Server in python on centos
    vertica merge 优化
    kettle crontab java: command not found
    Idea 使用maven+tomcat的时候,编译指定的Profile
    Java中Vector和ArrayList的区别
    Docker入门命令
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/5041523.html
Copyright © 2011-2022 走看看