• 设计模式之备忘录


    备忘录模式介绍

    快照

    备忘录模式是可以恢复或者说回滚、配置、版本、悔棋为核心功能的设计模式,而这种设计模式属于行为模式。在功能实现上是以不破坏原对象为基础增加备忘录操作类,记录原对象的行为从而实现备忘录模式。

    备忘录的设计实现方式,重点在于不更改原有类的基础上,增加备忘录存放记录。

    备忘录允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

    备忘录模式将创建状态快照的工作委派给实际状态的拥有者原发器对象,这样其他对象就不再需要从“外部”复制编辑器状态,编辑器类拥有其状态的完全访问权,可自行生成快照。建议将对象状态的副本存储在一个名为备忘录的特殊对象中,除了创建备忘录的对象外,任何对象都不能访问备忘录的内容,其他对象必须使用受限接口与备忘录进行交互,它们可以获取快照的元数据,但不能获取快照中原始对象的状态。

    备忘录模式结构

    基于嵌套类的实现

    • 1、原发器

      可以生成自身状态的快照,也可在需要时通过快照恢复自身的状态。

    • 2、备忘录

      原发器状态快照的值对象。通常做法是将备忘录设为不可变的,并通过构造函数一次性传递数据。

    • 3、负责人

      仅知道“何时”和“为何”捕捉原发器的状态,以及何时恢复状态。

    • 4、实现类

      备忘录类将被嵌套在原发器中,这样原发器就可访问备忘录的成员变量和方法,即使这些方法被声明为私有。另一方面,负责人对于备忘录的成员变量和方法的访问权限非常有限。它们只能在栈中保存备忘录,而不能修改其状态。

    适合场景

    • 当需要创建对象状态快照来恢复其之前的状态时。

    此模式允许你复制对象中的全部状态,并将其独立于对象进行保存。

    • 直接访问对象的成员变量,获取器或设置器将导致封装被突破时。

    备忘录让对象自行负责创建其状态的快照。任何其他对象都不能读取快照,有效的保障了数据的安全性。

    实现方式

    • 确定担任原发器角色的类。(明确程序使用的一个原发器中心 对象,还是多个较小对象)
    • 创建备忘录类。(声明对应每个原发器成员变量的备忘录成员变量)
    • 将备忘录类设为不可变。(只可通过构造函数接收数据)
    • 语言支持嵌套类则将备忘录写在原发器中,如果不支持,可从备忘录中抽取一个空接口,然后让其他所有对象通过接口来引用备忘录。
    • 在原发器中添加一个创建备忘录的方法。
    • 在原发器类中添加一个用于恢复自身状态的方法。
    • 不管负责人是命令对象、历史记录或其他完全不同的方法,它都必须要知道何时向原发器请求新的备忘录、如何存储备忘录以及何时使用特定备忘录来对原发器进行恢复。
    • 负责人与原发器之间的连接可以移动到备忘录中。

    优缺点

    优点

    • 在不破坏对象封装情况的前提下创建对象状态快照。
    • 可通过让负责人维护原发器状态历史记录来简化原发器代码。

    缺点

    • 若客户端频繁地创建备忘录,程序将消耗大量内存。
    • 负责人必须完整跟踪元发器的生命周期,这样才可以进行销毁。

    Demo

    备忘录不会影像它所处理的对象的内部结构,也不会影响快照中保存的数据。

    备忘录接口备忘录类

    发起人

    管理员类

    业务逻辑验证

    输出结果

    小寄语

    人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

    原创不易,给个关注。

    我是阿辉,感谢您的阅读,如果对你有帮助,麻烦关注、点赞、转发 谢谢。

    作者:阿辉
    关注我:微信扫描下面二维码,6T编程资料免费送。
    微信公众号:Andy阿辉
    写一些程序员的所思所想,希望对你有帮助。

    版权声明:本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    3747 [POI2015]Kinoman
    1303 [CQOI2009]中位数图
    3769 [spoj 8549] BST again
    1015 [JSOI2008]星球大战starwar
    1193 [HNOI2006]马步距离
    合并Git仓库不相关历史版本解决方案
    vue-cli项目实现动态锚点定位
    jQuery加css3实现菜单栏组件(可无限添加子列表)
    JavaScript文件转成base64编码
    Ajax获取服务器响应头部信息
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/15168541.html
Copyright © 2020-2023  润新知