备忘录模式是一种行为型设计模式,主要用于在软件系统中保存对象的状态,以便在以后可以恢复到之前的状态。这种模式的主要目的是解决系统状态的保存和恢复问题,同时确保系统的可撤销性。备忘录模式通常与命令模式结合使用,以实现对系统状态的操作。备忘录模式只能提供一次备忘吗?不是的,它可以提供多次备忘 。
备忘录模式的核心思想是将系统的状态信息存储在一个独立的对象中,这个对象被称为备忘录,当需要恢复到某个特定的状态时,只需从备忘录中获取相应的状态信息即可,这样可以避免直接操作原始对象,从而提高了系统的可维护性和可扩展性。
备忘录模式的主要组成部分包括:
1、抽象备忘录(Memento):这是一个用于封装备忘录内部状态的类,它包含一个指向具体备忘录对象的引用,以及一个用于存储状态信息的数据结构(如Map或List)。
2、具体备忘录(ConcreteMemento):这是一个实现了备忘录接口的具体类,它负责管理状态信息,并提供一个方法来获取之前保存的状态信息。
3、抽象记忆者(Originator):这是一个负责创建、更新和删除备忘录的类,它包含一个指向具体备忘录对象的引用,以及一个用于存储所有备忘录的方法。
4、具体记忆者(ConcreteOriginator):这是一个实现了记忆者接口的具体类,它负责创建、更新和删除备忘录,并提供一个方法来获取之前保存的状态信息。
在使用备忘录模式时,需要注意以下几点:
1、为了保证系统的可撤销性,应该在每次操作后都创建一个新的备忘录对象,而不是仅仅更新现有的备忘录对象,这可以通过在具体记忆者类中添加一个创建新备忘录的方法来实现。
2、在获取之前保存的状态信息时,应该检查备忘录中是否存在该状态信息,如果不存在,则可以抛出一个异常或返回一个默认值,这可以通过在抽象备忘录类中添加一个检查状态信息是否存在的方法来实现。
3、为了避免重复保存相同的状态信息,可以使用一个集合(如Set或Map)来存储已经保存的备忘录对象,在创建新的备忘录对象时,可以先检查集合中是否已经存在相同的状态信息,如果存在,则可以直接从集合中获取,而不是创建一个新的备忘录对象。
下面是一个简单的备忘录模式的Java实现示例:
import java.util.ArrayList; import java.util.List; // 抽象备忘录 interface Memento { // 获取之前保存的状态信息 String getState(); } // 具体备忘录A class ConcreteMementoA implements Memento { private String state; public ConcreteMementoA(String state) { this.state = state; } @Override public String getState() { return state; } } // 具体备忘录B class ConcreteMementoB implements Memento { private String state; public ConcreteMementoB(String state) { this.state = state; } @Override public String getState() { return state; } } // 抽象记忆者 interface Originator { // 保存当前状态到备忘录中 void saveToMemento(Memento memento); // 从备忘录中恢复之前保存的状态 void restoreFromMemento(Memento memento); } // 具体记忆者A class ConcreteOriginatorA implements Originator { private List<Memento> mementos = new ArrayList<>(); private String state; public ConcreteOriginatorA(String state) { this.state = state; } @Override public void saveToMemento(Memento memento) { if (memento instanceof ConcreteMementoA) { // 如果要保存的是具体备忘录A的状态,则直接将其添加到集合中即可 mementos.add((ConcreteMementoA) memento); } else if (memento instanceof ConcreteMementoB) { // 如果要保存的是具体备忘录B的状态,则需要根据当前状态生成一个新的具体备忘录对象,并将其添加到集合中即可 ConcreteMementoB newMemento = new ConcreteMementoB(state); // 这里仅作示例,实际情况可能需要更复杂的逻辑来生成新的状态对象 mementos.add(newMemento); } else if (memento == null) { // 如果要保存的是空状态,则直接将当前状态添加到集合中即可 mementos.add(null); // 这里仅作示例,实际情况可能需要更复杂的逻辑来表示空状态对象 } else { // 如果要保存的是其他类型的状态,则直接抛出异常即可,因为我们只支持具体的备忘录类型进行存储和恢复操作 throw new IllegalArgumentException("Unsupported memento type"); } } @Override public void restoreFromMemento(Memento memento) throws Exception {} // 这里仅作示例,实际情况可能需要更复杂的逻辑来根据备忘录中的信息恢复状态对象并执行相关操作,例如撤销操作等,在这个例子中,我们只是简单地将传入的备忘录对象添加到集合中即可,如果要实现撤销功能,还需要考虑如何处理重复的状态信息等问题。