备忘录模式是一种设计模式,它允许在不破坏封装性的前提下记录状态。这种模式可以用于记录程序运行过程中的状态信息,以便在需要时进行恢复或者重置。备忘录模式只能提供一次备忘,即在程序运行过程中只能保存一个状态信息。如果需要多次备忘,可以考虑使用其他技术,如数据库或者文件系统等。备忘录模式是一种非常实用的设计模式,可以帮助开发者更好地管理和维护程序的状态信息。
备忘录模式(Memento Pattern)是一种行为型设计模式,它允许你保存一个对象的内部状态,以便在之后可以恢复到该状态,这种模式的主要目的是支持撤销操作,例如撤销编辑文本、撤销删除文件等,备忘录模式通过将状态信息存储在另一个对象中来实现这一目标,这样就可以在不破坏封装性的前提下,记录和恢复状态。
备忘录模式的基本组成部分如下:
1、抽象备忘录(Memento):这是一个用于保存对象内部状态的接口,它定义了一个 saveState() 方法,用于将当前对象的状态保存到一个新的备忘录对象中。
public interface Memento { void saveState(); }
2、具体备忘录(ConcreteMemento):这是实现抽象备忘录接口的具体类,它负责保存对象的内部状态,并提供一个 restoreState() 方法,用于从备忘录中恢复状态。
public class ConcreteMemento implements Memento { private String state; public ConcreteMemento(String state) { this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; } }
3、指挥者(Originator):这是需要保存其内部状态的对象,它负责创建具体备忘录对象,并在需要时调用 saveState() 方法将状态保存到备忘录中,指挥者还需要提供一个 getMemento() 方法,用于从具体备忘录中恢复状态。
public class Originator { private String state; private List<Memento> mementos; public Originator(String state) { this.state = state; this.mementos = new ArrayList<>(); } public void setState(String state) { this.state = state; } public String getState() { return state; } public void addMemento(Memento memento) { mementos.add(memento); } public Memento getMemento(int index) throws Exception { if (index < 0 || index >= mementos.size()) { throw new Exception("Invalid index"); } return mementos.get(index); } }
4、负责者(Caretaker):这是一个辅助类,用于管理多个备忘录对象,它负责创建新的备忘录对象,并根据需要从已有的备忘录中恢复状态,负责者还可以提供一个 getAllMementos() 方法,用于获取所有保存的备忘录对象。
import java.util.ArrayList; import java.util.List; import java.util.Stack; public class Caretaker implements MementoControl { private Stack<Memento> mementoStack; private List<Memento> mementos; public Caretaker() { this.mementoStack = new Stack<>(); this.mementos = new ArrayList<>(); } public void add(Memento memento) throws Exception { mementoStack.push(memento); // 将新创建的备忘录压入栈中,并将其添加到列表中以供以后使用,如果之前已经存在相同类型和时间的备忘录,则会抛出异常,这是因为我们不允许同一个对象有多个不同的状态,如果要允许这种情况发生,可以将此方法修改为将新创建的备忘录添加到旧的备忘录后面而不是替换它,这个例子假设每个对象只能有一个与其关联的备忘录,如果我们想要支持一个对象具有多个关联的备忘录的情况,我们需要对此进行修改,如果我们想要支持一个对象具有多个不同类型或时间的备忘录的情况,我们也需要对此进行修改,为了简化起见,在此示例中我们只支持一种类型和时间的备忘录,当调用 add()方法时,如果已经存在相同类型和时间的备忘录,则会抛出异常,否则,就会将新创建的备忘录添加到栈中以及列表中,当调用 saveState()方法时,就会从栈顶获取一个备忘录并将其保存到一个新的具体备忘录中,然后再将新的备忘录添加到栈中以及列表中,当调用 restoreState()方法时,就会从栈顶获取一个备忘录并将其恢复为当前状态,然后再将该状态设置为当前状态,当调用 getAllMementos()方法时,就会返回所有保存的备忘录对象的列表。