设计模式之备忘录模式
备忘录模式
-
备忘录模式原型图:
-
示例代码:
// 抽象备忘录接口 public interface Memento { } // 发起人角色 @Data public class Originator { private String status; public Originator(String status) { this.status = status; } public Memento createMemento(){ ConcreteMemento memento = new ConcreteMemento(); memento.setStatus(this.status); return memento; } public void restoreMemento(Memento memento){ this.status = ((ConcreteMemento) memento).getStatus(); } // 备忘录角色 @Data private static class ConcreteMemento implements Memento{ private String status; } } // 备忘录管理员角色 public class Caretaker { private final Stack<Memento> stack = new Stack<>(); public Memento getMemento(){ return stack.pop(); } public void addMemento(Memento memento){ stack.push(memento); } } // 测试 public class MementoTest { public static void main(String[] args) { Caretaker caretaker = new Caretaker(); Originator originator = new Originator("开始状态"); caretaker.addMemento(originator.createMemento()); System.out.println(originator); originator.setStatus("第一次修改状态"); caretaker.addMemento(originator.createMemento()); System.out.println(originator); originator.setStatus("第二次修改状态"); caretaker.addMemento(originator.createMemento()); System.out.println(originator); System.out.println("======开始恢复状态==========="); originator.restoreMemento(caretaker.getMemento()); System.out.println(originator); originator.restoreMemento(caretaker.getMemento()); System.out.println(originator); originator.restoreMemento(caretaker.getMemento()); System.out.println(originator); } }
-
总结:上述示例备忘录角色采用了私有静态内部类实现抽象接口的方式,主要是保证备忘录对发起人开放,具有宽访问权限,对其他类(Caretaker)对Memento具有窄访问权限.
优点:简化了发起人实体类的职责,隔离状态的存储与获取,实现了信息的封装,并提供了状态回滚功能;
缺点:消耗资源.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探