热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式18之备忘录模式

背景我们直接开篇点题,备忘录模式解决什么问题呢?主要用于实现撤销功能。很多软件都有撤销功能,只需要按Ctrl+Z即可实现撤回。数据库也有回滚操作。游戏中有存档功能。竞速类游戏有时间

背景

我们直接开篇点题,备忘录模式解决什么问题呢?主要用于实现撤销功能。很多软件都有撤销功能,只需要按Ctrl + Z即可实现撤回。数据库也有回滚操作。游戏中有存档功能。竞速类游戏有时间回溯功能。

备忘录模式记录一个对象的内部状态,如果我们需要撤销当前操作。就能使数据回复到原来的状态。



什么是备忘录模式



Without violating encapsulation,capture and externalize an object's internal state so that the object can be restored to this state later.(在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。)


备忘录模式又叫快照模式。我们只要记住,使用备忘录模式就是实现撤销操作的一种设计模式。

备忘录模式主要由下面3个要素组成:




  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。


  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。


  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。



备忘录模式

代码实现


Memento

Caretaker

Originator

代码测试

@Test
public void test() {
    Originator or=new Originator();
    Caretaker cr=new Caretaker();
    or.setState("S0");
    System.out.println("初始状态:"+or.getState());
    cr.setMemento(or.createMemento()); //保存状态
    or.setState("S1");
    System.out.println("新的状态:"+or.getState());
    or.restoreMemento(cr.getMemento()); //恢复状态
    System.out.println("恢复状态:"+or.getState());
}

测试结果:

初始状态:S0
新的状态:S1
恢复状态:S0

关于备忘录模式的思考

我们再来举一个场景,如果你要开发一个流程审批系统。流程这里我简化为。流程审批里面肯定有驳回功能,比如在C流程时我们要驳回到B,是不是可以使用备忘录模式。

驳回

但是你发现了问题没有,如果状态很多,那么每个状态都需要备份一份,这样会占用比较大的内存资源。所以在使用备忘录模式的时候要考虑这个风险。

往期推荐

  • 我写出这样干净的代码,老板直夸我


  • 云南丽江旅游攻略


  • 使用ThreadLocal怕内存泄漏?


  • Java进阶之路思维导图


  • 程序员必看书籍推荐


  • 3万字的Java后端面试总结(附PDF)


扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料



  1. 回复"java" 获取java电子书;


  2. 回复"python"获取python电子书;


  3. 回复"算法"获取算法电子书;


  4. 回复"大数据"获取大数据电子书;


  5. 回复"spring"获取SpringBoot的学习视频。


  6. 回复"面试"获取一线大厂面试资料


  7. 回复"进阶之路"获取Java进阶之路的思维导图


  8. 回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)


  9. 回复"总结"获取Java后端面试经验总结PDF版


  10. 回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)


  11. 回复"并发导图"获取Java并发编程思维导图(xmind终极版)



另:点击【我的福利】有更多惊喜哦。


推荐阅读
author-avatar
creator
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有