设计模式:备忘录模式

目录

备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获和恢复对象的内部状态。备忘录模式可以将对象的状态保存到备忘录对象中,并在需要时从备忘录对象中恢复状态,实现对象状态的保存和回滚。

组件

在备忘录模式中,通常包含以下角色:

  1. 发起人(Originator):负责创建备忘录对象,并将自身的状态保存到备忘录对象中。
  2. 备忘录(Memento):用于存储发起人对象的状态。备忘录可以记录发起人的状态,也可以根据需要进行状态的恢复。
  3. 管理者(Caretaker):负责保存备忘录对象,并提供对备忘录的访问。管理者可以保存多个备忘录对象,实现多个时间点的状态回滚。

代码示例

java 复制代码
class Originator {
    private String state;
     public void setState(String state) {
        this.state = state;
    }
     public String getState() {
        return state;
    }
     public Memento saveStateToMemento() {
        return new Memento(state);
    }
     public void restoreStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}
 // 备忘录类
class Memento {
    private String state;
     public Memento(String state) {
        this.state = state;
    }
     public String getState() {
        return state;
    }
}
 // 管理者类
class Caretaker {
    private Memento memento;
     public void saveMemento(Memento memento) {
        this.memento = memento;
    }
     public Memento retrieveMemento() {
        return memento;
    }
}
 // 客户端代码
public class Main {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
         originator.setState("State 1");
        System.out.println("当前状态:" + originator.getState());
         // 保存状态
        caretaker.saveMemento(originator.saveStateToMemento());
         originator.setState("State 2");
        System.out.println("当前状态:" + originator.getState());
         // 恢复状态
        originator.restoreStateFromMemento(caretaker.retrieveMemento());
        System.out.println("恢复后的状态:" + originator.getState());
    }
}

在上述示例中,我们定义了发起人类(Originator)、备忘录类(Memento)和管理者类(Caretaker)。发起人类负责创建备忘录对象并保存状态,备忘录类用于存储状态,管理者类负责保存和提供对备忘录对象的访问。

在客户端代码中,我们创建了发起人对象和管理者对象。发起人对象设置了初始状态,并通过保存状态到备忘录对象中来保存状态。然后,我们修改发起人对象的状态,并通过从备忘录对象中恢复状态来回滚到之前的状态。

这个示例展示了如何使用Java实现备忘录模式,通过备忘录对象保存和恢复发起人对象的状态,实现对象状态的保存和回滚

源码中使用

备忘录模式在源码中有很多应用。以下是一些常见的源码中使用备忘录模式的情况:

  1. Java中的java.util.Date类:Date类提供了 getTime() 和 setTime() 方法来获取和设置日期的时间戳,可以用于保存和恢复日期对象的状态。
  2. Android开发中的Activity生命周期:在Android中,Activity的生命周期方法(如 onCreate() 、 onPause() 等)被用作保存和恢复Activity的状态,以便在系统需要时重新创建和恢复Activity。
  3. 数据库事务管理:在数据库中,事务管理器使用备忘录模式来保存数据库的状态,并在需要时回滚事务,以确保数据的一致性和完整性。
  4. 文本编辑器中的撤销/重做功能:文本编辑器中的撤销/重做功能使用备忘录模式来保存编辑操作的历史状态,以便用户可以撤销和重做操作。
    这些是备忘录模式在源码中的一些常见应用。备忘录模式通过备忘录对象来保存和恢复对象的状态,提供了一种可靠的方式来管理状态,并支持撤销和重做等操作。

优缺点

优点:

  1. 备忘录模式可以实现对象状态的备份和恢复,使得系统可以方便地回滚到之前的状态。
  2. 备忘录模式将状态保存在备忘录对象中,与原对象解耦,避免了状态暴露给其他对象,保护了对象的封装性。
  3. 备忘录模式可以灵活地扩展和修改备忘录对象,以满足不同的需求。
    缺点:
  4. 备忘录模式可能会消耗大量的内存,特别是在需要保存大量状态的情况下。
  5. 如果频繁备份和恢复对象状态,会对系统的性能产生一定的影响。
  6. 当对象的状态较多时,管理备忘录对象的成本可能会增加。

总结

备忘录模式通过备份和恢复对象状态,提供了一种可靠的方式来管理对象状态。它可以保护对象的封装性,并提供灵活的状态恢复机制。然而,备忘录模式可能会消耗较多的内存,并对系统性能产生一定的影响。在使用备忘录模式时,需要权衡其优缺点,并根据具体情况进行选择。

相关推荐
维天说1 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19942 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充2 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充2 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了2 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品3 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘3 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记3 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵3 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
极光代码工作室4 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发