设计模式之备忘录模式
来源:互联网 发布:大学生信用卡额度 知乎 编辑:程序博客网 时间:2024/06/08 01:07
设计模式之备忘录模式
备忘录模式的简介
在日常生活中,总会出现这样的情况,有时候做错了一件事,然后特别希望能够回到发生这件事情之前。当然,这在日常生活中是不可能,不过,在软件开发过程却是可以实现的,比如说我们经常使用的CTRL + Z,或者一些其他软件的回退功能等等,这其中就涉及到了备忘录模式(Memonto)。所谓的备忘录模式,其实就是把当前对象的一个状态进行保存,然后在必要的时候可以将其恢复,使得对象能够回滚到之前的状态
备忘录模式的具体实现
备忘录模式中,有三个比较重要的概念,一个是目标对象,也就是我们要进行保存的对象,另外一个是备份对象,用于保存目标对象,还有一个是备份对象的管理对象(有时候需要多次备份,此时使用该对象来进行管理是比较合适的)
接下来我们来实现简单的备忘录模式
/** * Created by Huanfeng.Xu on 2017-06-23. * 英雄对象 */public class Hero { private String name; private double power; // 篇幅原因省略set/get方法 public Memento backup(){ return new Memento(getName(), getPower()); } public void restore(Memento memento){ setName(memento.getName()); setPower(memento.getPower()); }}/** * Created by Huanfeng.Xu on 2017-06-23. * 备忘录对象,本质上等同于Hero对象 */public class Memento { private String name; private double power; // 篇幅原因,省略set/get方法}/** * Created by Huanfeng.Xu on 2017-06-23. * CareTaker,用于管理备忘录对象 */public class CareTaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; }}
这里需要注意的一点是,虽然这里使用了Memento对象,不过这里我们也看到,本质上它跟Hero对象是一致的,所以,实际上也是可以不需要这个对象,只不过在保存Hero对象的时候需要注意,需要保存的是Hero对象的深拷贝,而不是直接令其指向Hero对象。
在这里一开始会觉得CareTaker对象是多余的,实际上不然,这里我们只保留了一个备份,也就是当下一次进行备份的时候,前面的备份就会被覆盖了,此时,可以在CareTaker对象中提供一个容器类,比如List等,这样子就可以保存多份的备份了,恢复时只需要根据需要恢复特定的备份对象即可,所以说CareTaker对象并不是多余的。
这里需要注意的是,当备份的对象比较多的时候,可能占不少内存,此时,为了节省内存或者其他原因,可以将比较久远的备份持久化到数据库或者本地磁盘中,这样子既有利于对象的长久保留,又有助于节省不必要的内存开销
总结
备忘录模式也是一种比较常用的设计模式,主要用于对象的保存、恢复的相关的操作,比如订单的撤销,回滚等操作,不过需要注意的是,当备份的数量比较多的时候,可能会占据不少内存,此时可以选择将其持久化到磁盘中。
- 设计模式之备忘录
- 设计模式之备忘录
- 设计模式之备忘录
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式 之 备忘录模式
- 设计模式之备忘录模式
- 小明买书
- Android系统源码编译之5---安装xshell android环境 环境配置以及安装jdk
- Tensorflow手写数字识别之简单神经网络分类与CNN分类效果对比
- 一个能够Bypass大部分杀软的工具:avoidz-master
- 32、不一样的C++系列--函数模板
- 设计模式之备忘录模式
- 一个通用的Makefile
- SVN authz 配置详解 转载
- 一种Unable to build NVIDIA kernal module的解决方法
- leetcode 538. Convert BST to Greater Tree
- Top命令基础
- Java批量生成文件并写入内容
- unix课设购物系统基于服务端和客户端
- SVN踩坑日记