备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,当前很多软件都提供了撤销操作,其中就使用了备忘录模式。
备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

Originator(原发器):它是一个需要保存状态的类,可以创建一个备忘录/备份,并存储它的当前内部状态,也可以使用备忘录来恢复其内部状态。
Memento(备忘录):存储原发器的内部状态。除了原发器类,备忘录类不能被其他类创建和修改。一般通过将Memento类与Originator类定义在同一个包中来实现封装(也可以作为内部类),使用默认访问标识符来定义Memento类,即保证其包内可见。
Caretaker(负责人):负责人又称为管理者,它负责保存备忘录。在负责人类中可以存储一个或多个备忘录对象,它只负责存储对象,而不能修改对象(负责任类只提供备忘录对象的读写接口,不提供备忘录属性的读写接口),也无须知道对象的实现细节。负责人对象可以保存一个备忘录数组,从而实现原发器的多次撤销。
备注:只存储一个备忘录对象是为什么需要负责人对象?因为包外的客户端无法声明备忘录类的引用,无法获取引用到原发器类创建的备忘录对象,客户端通过引用负责人对象间接引用备忘录对象。
//三个类要声明在同一个包里面,且Memento不对包外客户类开放
package dp.memento;
@Data
public class Originator {
private String state;
// 创建一个备忘录对象
public Memento createMemento() {
return new Memento(state);
}
// 根据备忘录对象恢复原发器状态
public void restoreMemento(Memento m) {
state = m.state;
}
}
package dp.memento;
//备忘录类,默认可见性,包内可见
class Memento{
private String state;
public Memento(String state){
this.state = state ;
}
}
package dp.memento;
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento=memento;
}
}
//客户端只针对 Originator、 Caretaker类编程,无法声明调用Memento对象
public class Client{public static void main(String[] args) {
Originator originator=new Originator();
originator.setState("A");
Caretaker caretaker=new Caretaker();
//保存状态
caretaker.setMemento(originator.createMemento());
originator.setState("B");
//恢复状态
originator.restoreMemento(caretaker.getMemento());
System.out.println(originator.getState());
}
}
保证备份不被修改
备忘录是一个很特殊的对象,对于原发器而言,它可以调用备忘录的所有信息,允许原发器访问返回到先前状态所需的所有数据;对于负责人而言,只负责备忘录的保存并将备忘录传递给其他对象;对于其他对象而言,只需要从负责人处取出备忘录对象并将原发器对象的状态恢复,而无须关心备忘录的保存细节。理想的情况是只允许生成该备忘录的那个原发器访问备忘录的内部状态。
————————————————
版权声明:本文为CSDN博主「LoveLion」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lovelion/article/details/7526747