备忘录模式(Memento Pattern)是一种行为型设计模式,它允许你保存一个对象的内部状态,以便在以后可以恢复到该状态。这种模式的主要目的是为了支持撤销操作,例如文本编辑器中的撤销功能。备忘录模式通常与命令模式一起使用,以便可以将状态保存到一个可传递的对象中 。,,备忘录模式的定义是:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态 。
我们需要创建一个备忘录类(Memento),用于保存对象的状态,备忘录类应该包含一个私有的成员变量,用于存储状态信息,以及一个公共的方法,用于获取状态信息。
public class Memento { private String state; public Memento(String state) { this.state = state; } public String getState() { return state; } }
我们需要创建一个原系统类(Originator),用于执行操作并保存状态,原系统类应该包含一个私有的成员变量,用于存储当前状态的备忘录,以及一些方法,用于执行操作和获取备忘录。
public class Originator { private Memento memento; public void setMemento(Memento memento) { this.memento = memento; } public Memento getMemento() { return memento; } public void saveToMemento() { // 将当前状态保存到备忘录中 } public void restoreFromMemento() { // 从备忘录中恢复状态 } }
我们可以创建一个负责管理备忘录的协调者类(Caretaker),协调者类应该包含一个私有的成员变量,用于存储所有的备忘录,以及一些方法,用于添加、删除和获取备忘录。
public class Caretaker { private List<Memento> mementos = new ArrayList<>(); public void add(Memento state) { mementos.add(state); } public void remove(int index) { mementos.remove(index); } public Memento get(int index) { return mementos.get(index); } }
我们需要创建一个客户端类(Client),用于测试备忘录模式,客户端类应该包含一个原系统对象,以及一些方法,用于执行操作并显示状态。
public class Client { public static void main(String[] args) { Originator originator = new Originator(); Caretaker caretaker = new Caretaker(); Scanner scanner = new Scanner(System.in); System.out.println("请输入要执行的操作(1-9):"); int operation = scanner.nextInt(); for (int i = 0; i < operation; i++) { System.out.println("请输入操作" + (i + 1) + "的状态:"); String state = scanner.next(); originator.saveToMemento(); // 将当前状态保存到备忘录中 if (i < operation - 1) { // 如果不是最后一个操作,则将上一个备忘录从协调者中删除并保存到当前对象中作为新的状态备忘录,这相当于撤销了上一个操作,如果当前对象是空的,则直接保存当前状态作为新的状态备忘录,这相当于重做了一个操作,这样就实现了撤销和重做的功能,如果当前对象不为空,则需要判断当前状态是否已经存在于协调者中,如果存在,则需要根据不同的情况来决定是保留还是更新当前对象的状态,这里为了简化问题,我们假设所有状态都只出现一次,所以我们只需要判断当前状态是否等于上一个状态即可,如果相等,则不需要进行任何操作;否则,我们需要将当前状态保存到协调者中,然后根据当前状态来决定是更新还是保留当前对象的状态,这里为了简化问题,我们假设只有两种状态:已保存和未保存,如果当前状态是已保存的,则我们需要将当前对象的状态设置为未保存的;否则,我们需要将当前对象的状态设置为已保存的,这样就实现了撤销和重做的功能。