定义是: 不破坏对象封装性,保存对象的内部状态。
它有个别名: 备份和恢复模式
如下所示,有个变量a,但是a的内容错了,现在要把a的内容换一下。
String a="a";
//····一系列操作后····a=1234567
//此时a的原来数据就丢失了。
String temp = a;//如果在改变a数据前,将它给另一个对象先保存下。
//此时a能从temp恢复原来的内容。
a = temp;
把这些变成自己写的对象的话,那么就需要一个额外的temp对象,用于保存A这个对象的内部数据。
这里就不使用短信来举例了,在idea中有个Local History的功能,在写代码时很实用,每次想查看之前代码都可以右击查看历史代码记录。
如上图所示,Memonto中保存了某一次ctrl+s的代码信息,History中保存了List。
CodeService就是相当于Idea。
/**
* @author lw
* @date 2022/3/29 0029
* @description 代码服务
*/
public class CodeService {
private History history = new History();
/**
* ctrl+s 保存时
* @param info
*/
public void save(CodeInfo info) {
CodeInfo backup = info.clone();
backup.createTime = new Date();
Memonto memonto = new Memonto();
memonto.info = backup;
history.saveMemonto(memonto);
}
/**
* 调用历史记录
*/
public void getHistorys(){
for (Memonto memonto : this.history.getMemontos()) {
System.out.println(memonto.info.toString());
}
}
}
/**
* @author lw
* @date 2022/3/31 0031
* @description 记忆类
*/
public class Memonto {
CodeInfo info = null;
public void rememberInfo(CodeInfo info){
this.info = info;
}
public CodeInfo restoreInfo(){
return this.info;
}
}
/**
* @author lw
* @date 2022/4/1 0001
* @description 历史记录
*/
public class History {
private List<Memonto> memontos = new ArrayList<>();
public void saveMemonto(Memonto memonto) {
this.memontos.add(memonto);
}
public Memonto getMemonto(int index) {
return this.memontos.get(index);
}
public List<Memonto> getMemontos() {
return this.memontos;
}
}
调用者
CodeInfo codeInfo = new CodeInfo();
codeInfo.code = "String A = 'hello world'";
CodeService codeService = new CodeService();
codeService.save(codeInfo);
Thread.sleep(2000);
codeInfo.code = "A = 'no hello'";
codeService.save(codeInfo);
codeService.getHistorys();
此处就相当于我们在idea中写代码,写一会保存一下,然后突然想看下之前改了什么代码,就是这么一个功能。
这个模式我一般很少用到,最多是用简单体,用临时变量来保存,真的很少说写一堆类来保存某一刻的状态。