当前位置:首页 > 后端开发 > 正文

备忘录用java怎么编写

Java编写备忘录,可定义一个Memo类存储信息,通过ArrayList等集合管理多个备忘录对象,实现增删改查等功能

Java中编写备忘录模式,通常涉及三个主要角色:发起人(Originator)备忘录(Memento)管理者(Caretaker),以下是详细的实现步骤和示例代码:

角色定义

  1. 发起人(Originator):负责维护和保存自己的状态,可以创建备忘录对象并将当前状态存储到备忘录中,同时也可以从备忘录中恢复状态。

  2. 备忘录(Memento):用于存储发起人对象的内部状态,备忘录对象对发起人以外的对象是不可见的,以保护状态的完整性。

  3. 管理者(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

详细解释

  1. 备忘录类(Memento):这个类非常简单,只包含一个状态字段和相应的getter和setter方法,它的主要作用是存储发起人的状态。

    备忘录用java怎么编写  第1张

  2. 发起人类(Originator):这个类包含了需要保存和恢复的状态,它提供了saveStateToMemento方法来创建并返回一个备忘录对象,以及getStateFromMemento方法来从备忘录对象中恢复状态。

  3. 管理者类(Caretaker):这个类负责保存备忘录对象,它使用一个列表来存储多个备忘录对象,并提供addget方法来管理这些备忘录。

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

优点与缺点

  1. 优点

    • 封装性:备忘录模式将状态的存储和恢复过程封装在备忘录类中,使得发起人的内部状态细节对外隐藏。
    • 灵活性:支持恢复到任意历史版本,而不仅仅是最新的版本。
    • 简化控制逻辑:避免了在代码中直接处理复杂的状态恢复逻辑,简化了系统的控制流程。
  2. 缺点

    • 内存消耗:如果需要保存大量的状态,备忘录模式可能会导致内存消耗过大。
    • 复杂性:在某些情况下,备忘录模式可能会增加代码的复杂性,特别是当需要保存的状态非常复杂时。

适用场景

  1. 撤销/重做功能:在文本编辑器、图像处理软件等应用中,可以使用备忘录模式来实现撤销和重做功能,每次执行操作时,都创建一个备忘录来保存当前状态,以便在需要时可以恢复到之前的状态。

  2. 事务管理:在数据库事务管理中,可以使用备忘录模式来保存事务开始前的状态,以便在事务失败时可以回滚到之前的状态。

  3. 游戏开发:在游戏开发中,可以使用备忘录模式来保存游戏的状态,以便在需要时可以恢复到之前的状态,例如在游戏存档和读档功能中。

  4. 工作流引擎:在工作流引擎中,可以使用备忘录模式来保存工作流的状态,以便在需要时可以恢复到之前的状态。

FAQs

  1. 问题:备忘录模式与命令模式有什么区别?
    回答:备忘录模式关注对象状态的保存和恢复,而命令模式封装一个请求为一个对象,从而可以将请求排队、日志记录或支持撤销操作,备忘录模式可以作为命令模式的补充,比如在命令模式中,每个命令可以返回一个备忘录对象,以便后续撤销时使用。

  2. 问题:如何确保备忘录中的状态不会被外部修改?
    回答:可以通过将备忘录类设计为不可变类(即没有setter方法)或者将备忘录对象设置为私有,并且只通过发起人提供的方法来访问和修改状态,这样可以确保备忘录中的状态只能通过发起人来修改,从而保证了状态的封装性

0