什么是备忘录模式
备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
模式角色
- Originator发起者(UserOriginator)角色:负责创建一个备忘录,并且可以记录、恢复自身的内部状态。可以根据需要决定备忘录保存自身的那些内部状态。
- Memento备忘录(Memento)角色:用于存储发起者角色的状态,防止发起者以外的的对象访问备忘录。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象,Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
- Caretaker备忘录管理者(Caretaker)角色:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。
UML类图

代码实现
现实生活中的 打游戏时的存档,Windows 里的 ctri + z等都是备忘录的应用场景。代码中以用户信息恢复为例,实现备忘录模式。
public class UserOriginator {
private String username;
private String passwd;
// 创建一个备忘录
public Memento createMemento() {
return new Memento(username, passwd);
}
// 记录、恢复自身的内部状态
public void restoreMemento(Memento memento) {
this.passwd = memento.getPasswd();
this.username = memento.getUsername();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public void show() {
System.out.println("用户名:" + this.username);
System.out.println("密码:" + this.passwd);
}
}
public class Memento {
private String username;
private String passwd;
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getUsername() {
return username;
}
public Memento(String username, String passwd) {
this.username = username;
this.passwd = passwd;
}
}
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) {
System.out.println("*******用户初始信息********************");
UserOriginator userOriginator = new UserOriginator();
userOriginator.setUsername("lisi");
userOriginator.setPasswd("654321");
userOriginator.show();
//备忘录存储发起人对象内部状态
Caretaker caretaker = new Caretaker();
caretaker.setMemento(userOriginator.createMemento());
// lisi修改为张三,654321修改为123456
userOriginator.setUsername("zhangsan");
userOriginator.setPasswd("123456");
userOriginator.show();
// 恢复状态
userOriginator.restoreMemento(caretaker.getMemento());
userOriginator.show();
}
}
*******用户初始信息********************
用户名:lisi
密码:654321
// 修改后的用户信息
用户名:zhangsan
密码:123456
// 恢复初始化用户信息
用户名:lisi
密码:654321
优点
- 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
- 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
- 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
缺点 - 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
备忘录模式完整代码
网友评论