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

备忘录用java怎么编写

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

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

角色定义

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

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

  3. 管理者(Caretaker):负责保存备忘录对象,管理保存的各种备忘录,并在适当的时候将备忘录返还给发起人。

示例代码

以下是一个使用Java实现的简单备忘录模式示例:

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

备忘录类(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方法,它的主要作用是存储发起人的状态。

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

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

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

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

  5. 优点与缺点

    1. 优点

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

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

    适用场景

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

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

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

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

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

    5. FAQs

      1. 问题:备忘录模式与命令模式有什么区别?

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

      2. 问题:如何确保备忘录中的状态不会被外部修改?

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

0