备忘录模式定义
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
备忘录模式结构图
备忘录模式角色介绍
发起人角色:Originator,它是一个普通业务类,当需要保存内部状态时被设计为发起人,负责定义状态的备份范围、创建和恢复备忘录数据。
备忘录角色:Memento,负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态;一般备忘录类内部属性与发起人类
备忘录管理员角色:Caretaker,负责管理、保存和提供备忘录,但是不能对备忘录的内容进行操作或检查。可以存储一个或多个备忘录对象,它只负责存储对象,而不能修改对象,也无须知道对象的实现细节。
备忘录模式结构代码
发起人:
public class Originator {
//发起人(普通业务类)内部状态
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//创建备忘录
public Memento createMemento(){
return new Memento(this.state);
}
//恢复一个备忘录
public void restoreMemento(Memento memento){
this.setState(memento.getState());
}
}
备忘录:
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;
}
}
备忘录管理员:
public class Caretaker {
//存储备忘录对象
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
客户端:
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
originator.setState("状态1");
System.out.println(originator.getState());//状态1
//创建备忘录
Memento memento = originator.createMemento();
//存储备忘录
Caretaker caretaker = new Caretaker();
caretaker.setMemento(memento);
originator.setState("状态2");
System.out.println(originator.getState());//状态2
//恢复备忘录状态
originator.restoreMemento(caretaker.getMemento());
System.out.println(originator.getState());//状态1
}
}
备忘录模式运行机制
备忘录模式中,各个角色职责非常明确,发起人角色负责创建、修改备忘录以及把备忘录状态同步给自己;备忘录角色负责存储发起人角色对象的状态,是一个发起人角色的状态容器;备忘录管理员角色是备忘录对象容器,职责就是存储、管理备忘录对象;三者配合完成备忘录模式。
备忘录模式解决的核心问题
备忘录模式是以解耦的方式实现业务对象某一时刻状态存储和复原。