备忘录模式将创建状态快照 /备份的工作委派给实际状态的拥有者 (Originator) 对象。 这样其他对象就不再需要从 “外部” 复制文件状态了, 拥有者拥有其文件状态的完全访问权, 因此可以自行生成快照。
设计模式,一定要敲代码理解
文件信息( 需备份的源对象)
/**
* @author ggbond
* @date 2024年04月16日 08:38
*/
public class LogFile {
private String name;
private int size;
private Date time;
private int version;
public LogFile(String name, int size, Date time, int version) {
this.name = name;
this.size = size;
this.time = time;
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
@Override
public String toString() {
return "LogFile{" +
"name='" + name + '\'' +
", size=" + size +
", time=" + time +
", version=" + version +
'}';
}
}
备忘录(对备份源文件进行封装扩展)
/**
* @author ggbond
* @date 2024年04月16日 08:40
* 备忘录类,在源数据LogFile进行封装扩展,也称快照信息。。
*/
public class Memento {
private LogFile logFile;
public Memento(LogFile logFile) {
this.logFile = logFile;
}
public LogFile getLogFile() {
return logFile;
}
public void setLogFile(LogFile logFile) {
this.logFile = logFile;
}
}
拥有者/操作员
/**
* @author ggbond
* @date 2024年04月16日 08:42
* 记录操作者, 能对记录获取与修改的同时,进行记录保存为快照与依据快照进行进行恢复数据
*/
public class Originator {
private LogFile logFile;
public LogFile getLogFile() {
return logFile;
}
public void setLogFile(LogFile logFile) {
this.logFile = logFile;
}
//保存为快照
public Memento save(){
return new Memento(logFile);
}
//依据快照恢复现在操作的文件
public void getMemento(Memento memento) {
this.logFile=memento.getLogFile();
}
}
管理员(版本控制)
/**
* @author ggbond
* @date 2024年04月16日 08:52
*/
public class Administrator {
private int cursor=0;//游标 版本指针
private Map<Integer, Memento> map=new HashMap<>();
private List<Memento> list=new ArrayList<>();
测试与结果
/**
* @author ggbond
* @date 2024年04月16日 09:23
*/
public class Main {
public static void main(String[] args) {
//记录操作者
Originator originator=new Originator();
originator.setLogFile(new LogFile("file_ggbond1",30,new Date(),1));
//备份中心
Administrator administrator=new Administrator();
administrator.add(originator.save());//备份
originator.setLogFile(new LogFile("file_ggbond2",31,new Date(),2));
administrator.add(originator.save());//备份
originator.setLogFile(new LogFile("file_ggbond3",33,new Date(),3));
administrator.add(originator.save());//备份
//回滚
originator.getMemento(administrator.undo());
System.out.println(originator.getLogFile().toString());
//再回滚
originator.getMemento(administrator.undo());
System.out.println(originator.getLogFile().toString());
//再回滚
originator.getMemento(administrator.undo());
System.out.println(originator.getLogFile().toString());
//前进版本
originator.getMemento(administrator.redo());
System.out.println(originator.getLogFile().toString());
}
}
LogFile{name='file_ggbond3', size=33, time=Tue Apr 16 09:35:53 CST 2024, version=3}
LogFile{name='file_ggbond2', size=31, time=Tue Apr 16 09:35:53 CST 2024, version=2}
LogFile{name='file_ggbond1', size=30, time=Tue Apr 16 09:35:53 CST 2024, version=1}
LogFile{name='file_ggbond2', size=31, time=Tue Apr 16 09:35:53 CST 2024, version=2}
总结
可以在不破坏对象封装情况的前提下创建对象状态快照。实用性偏弱,数据不会保存在内存而是数据库。
代码下载
代码下载