备忘录模式(Memento)
1、背景
在日常生活中,当我们重装电脑系统时,或多或少都会将之前的系统备份,以防日后电脑发生故障时能够及时恢复。备份思想无处不在,在编码工作中亦如此。Java是面向对象的编程语言,核心的思想就是对象。我们在使用对象的过程中,可能会频繁的修改对象的相关值,若这些相关值每一个都意义(或都很重要),就需要对以前的值进行备份操作。备忘录模式正是针对的对象的备份。
2、概述
①定义
备忘录模式将对象的数据做若干次备份,修改过后的对象可通过备份数据恢复。
②结构
- 备份类(Memento),用于存储对象的备份数据
- 备份仓库类(Warehouse),用于存储备份类
- 要被备份的主体类(Info),有相关属性,和产生备份和恢复方法
③优势
- 有利于增强代码的健壮性
- 有利于适应实际场景需求,增强其扩展性和可维护性
3、实例分析
本例依照本张UML图所写。代码已上注释。
/**
* @author Hanlin Wang
*/
public class MementoMode {
public static void main(String[] args) {
//添加三个备份:zhangsan、lisi、wangwu
Info info = new Info("zhangsan");
Memento backUp = info.backUp();
Warehouse.addMemento(backUp);
info.setValue("lisi");
Memento backUp2 = info.backUp();
Warehouse.addMemento(backUp2);
info.setValue("wangwu");
Memento backUp3 = info.backUp();
Warehouse.addMemento(backUp3);
//检查备份库
Warehouse.check();
System.out.println("-------");
System.out.println(info.getValue());
System.out.println("-------");
//恢复为zhangsan
info.restore(1);
//备份后
System.out.println(info.getValue());
}
}
//定义被用来备份的类
class Info{
String value;
public Info(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Memento backUp(){
return new Memento(this.value);
}
public void restore(){
this.value = Warehouse.getMemento(Warehouse.version).getValue();
}
public void restore(Integer version){
this.value = Warehouse.getMemento(version).getValue();
}
}
//定义备份类
class Memento{
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Memento(String value) {
this.value = value;
}
}
//定义仓库类,存储备份类
class Warehouse{
private static HashMap<Integer, Memento> memento
= new HashMap<Integer, Memento>();
public static int version = 0;
public static Memento getMemento(Integer version) {
return memento.get(version);
}
public static void addMemento(Memento memento) {
Warehouse.memento.put(++version, memento);
}
public static void removeMemento(Integer version) {
Warehouse.memento.remove(version);
}
public static void check(){
Set<Entry<Integer, Memento>> entrySet = memento.entrySet();
for (Entry<Integer, Memento> entry : entrySet) {
Memento mem = entry.getValue();
String value = mem.getValue();
Integer version = entry.getKey();
System.out.println("version : " + version + " | value : " + value);
}
}
}
分析:Memento为备份类,Info为主体类,Warehouse为备份仓库类。Info中存储value属性,并定义了backUp备份方法,该方法返回一个带有当前Info类对象的value值的Memento对象,定义了restore方法,恢复最近时间备份的数据(version值最大的Memento对象)。Memento定义了value属性,用于存储Info的value属性。Warehouse中定义Map< Integer, Memento> memento用于存储Memento对象,每个Memento对象在进入Warehouse时都会生成一个version版本号,定义了有关增改Memento的方法,check方法用于遍历所有的Memento对象及其自带的版本信息。
运行结果:
version : 1 | value : zhangsan
version : 2 | value : lisi
version : 3 | value : wangwu
wangwu
zhangsan
Tips:”—–”在CSDN Markdown编辑器中被转意为标题,因此把它删除。