备忘录用java怎么编写
- 后端开发
- 2025-07-13
- 4724
Java中编写备忘录模式,通常涉及三个主要角色:发起人(Originator)、备忘录(Memento)和管理者(Caretaker),以下是详细的实现步骤和示例代码:
角色定义
-  发起人(Originator):负责维护和保存自己的状态,可以创建备忘录对象并将当前状态存储到备忘录中,同时也可以从备忘录中恢复状态。 
-  备忘录(Memento):用于存储发起人对象的内部状态,备忘录对象对发起人以外的对象是不可见的,以保护状态的完整性。 
-  管理者(Caretaker):负责保存备忘录对象,管理保存的各种备忘录,并在适当的时候将备忘录返还给发起人。 
示例代码
以下是一个使用Java实现的简单备忘录模式示例:
备忘录类(Memento)
public class Memento {
    private String state;
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
} 
发起人类(Originator)
public 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 getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
} 
管理者类(Caretaker)
import java.util.ArrayList;
import java.util.List;
public class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();
    public void add(Memento state) {
        mementoList.add(state);
    }
    public Memento get(int index) {
        return mementoList.get(index);
    }
} 
客户端代码(演示如何使用备忘录模式)
public class MementoPatternDemo {
    public static void main(String[] args) {
        // 创建发起人对象
        Originator originator = new Originator();
        // 创建管理者对象
        Caretaker caretaker = new Caretaker();
        // 设置初始状态并保存到备忘录
        originator.setState("State #1");
        System.out.println("Initial State: " + originator.getState());
        caretaker.add(originator.saveStateToMemento());
        // 修改状态并保存新的备忘录
        originator.setState("State #2");
        System.out.println("Updated State: " + originator.getState());
        caretaker.add(originator.saveStateToMemento());
        // 恢复到之前的状态
        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("Restored State: " + originator.getState());
    }
} 
运行结果
Initial State: State #1 Updated State: State #2 Restored State: State #1
详细解释
-  备忘录类(Memento):这个类非常简单,只包含一个状态字段和相应的getter和setter方法,它的主要作用是存储发起人的状态。  
-  发起人类(Originator):这个类包含了需要保存和恢复的状态,它提供了 saveStateToMemento方法来创建并返回一个备忘录对象,以及getStateFromMemento方法来从备忘录对象中恢复状态。
-  管理者类(Caretaker):这个类负责保存备忘录对象,它使用一个列表来存储多个备忘录对象,并提供 add和get方法来管理这些备忘录。
-  客户端代码:在客户端代码中,我们创建了发起人和管理者对象,设置了初始状态并保存到备忘录中,然后修改了状态并再次保存备忘录,我们从备忘录中恢复了之前的状态。 
优点与缺点
-  优点:  - 封装性:备忘录模式将状态的存储和恢复过程封装在备忘录类中,使得发起人的内部状态细节对外隐藏。
- 灵活性:支持恢复到任意历史版本,而不仅仅是最新的版本。
- 简化控制逻辑:避免了在代码中直接处理复杂的状态恢复逻辑,简化了系统的控制流程。
 
-  缺点: - 内存消耗:如果需要保存大量的状态,备忘录模式可能会导致内存消耗过大。
- 复杂性:在某些情况下,备忘录模式可能会增加代码的复杂性,特别是当需要保存的状态非常复杂时。
 
适用场景
-  撤销/重做功能:在文本编辑器、图像处理软件等应用中,可以使用备忘录模式来实现撤销和重做功能,每次执行操作时,都创建一个备忘录来保存当前状态,以便在需要时可以恢复到之前的状态。 
-  事务管理:在数据库事务管理中,可以使用备忘录模式来保存事务开始前的状态,以便在事务失败时可以回滚到之前的状态。 
-  游戏开发:在游戏开发中,可以使用备忘录模式来保存游戏的状态,以便在需要时可以恢复到之前的状态,例如在游戏存档和读档功能中。  
-  工作流引擎:在工作流引擎中,可以使用备忘录模式来保存工作流的状态,以便在需要时可以恢复到之前的状态。 
FAQs
-  问题:备忘录模式与命令模式有什么区别? 
 回答:备忘录模式关注对象状态的保存和恢复,而命令模式封装一个请求为一个对象,从而可以将请求排队、日志记录或支持撤销操作,备忘录模式可以作为命令模式的补充,比如在命令模式中,每个命令可以返回一个备忘录对象,以便后续撤销时使用。
-  问题:如何确保备忘录中的状态不会被外部修改? 
 回答:可以通过将备忘录类设计为不可变类(即没有setter方法)或者将备忘录对象设置为私有,并且只通过发起人提供的方法来访问和修改状态,这样可以确保备忘录中的状态只能通过发起人来修改,从而保证了状态的封装性
 
  
			