备忘录模式将创建状态快照 /备份的工作委派给实际状态的拥有者 (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;}@Overridepublic 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}
总结
可以在不破坏对象封装情况的前提下创建对象状态快照。实用性偏弱,数据不会保存在内存而是数据库。
代码下载
代码下载