一 定义
备忘录模式也是一种行为模式,该模式用于保存和恢复对象的状态,向我们提供了一种类似于“后悔药”的机制,一旦出现了操作失误,可以把存储的历史状态取回,即可回到以前的状态。备忘录模式需要被保存的对象状态不能被对象从外部访问。
定义:在不破坏封闭的前提下,捕获一个对象的内部内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态。
二 模式结构

角色介绍:
- Originator:负责创建一个备忘录,可以存储它当前的状态,也可以恢复自身的内部状态。
- Memoto:备忘录角色,用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memoto。
- Caretaker:备忘录的管理者,负责存储备忘录,不能对备忘录的内容进行操作和访问,只能将备忘录传递给其它对象。
三 实例
以一个保存用户信息为例,给用户信息设置一个初始状态,然后创建一个备份,存储备份,修改用户信息,然后再用备份还原到初始状态。
代码如下:
- 备忘录
备忘录里保存着我们需要存储和恢复的信息。
public class Memoto {
// 用户名
private String userName;
// 密码
private String password;
// 电话号码
private String phoneNumber;
public Memoto(String username,String password, String phone){
this.userName=username;
this.password=password;
this.phoneNumber=phone;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
- UserInfoOriginator
UserInfoOriginator有两个重要的方法,一个是方法时保存备忘录,在此方法里创建备忘录,返回一个新的备忘录对象,要想保存备忘录对象,要将此备忘录对象传到备忘录管理者Caretaker里存储。第二个是恢复备忘录里的信息,需要从备忘录管理者取出原先保存的备忘录对象,传入此方法,恢复备忘录里的信息。
public class UserInfoOriginator {
// 用户名
private String userName;
// 密码
private String password;
// 电话号码
private String phoneNumber;
/**
* 保存一个备忘录
* @return 返回一个新的备忘录对象
*/
public Memoto saveMemoto(){
return new Memoto(userName,password,phoneNumber);
}
/**
* 恢复备忘录对象
* @param memoto
*/
public void restoreMemoto(Memoto memoto){
this.userName=memoto.getUserName();
this.password=memoto.getPassword();
this.phoneNumber=memoto.getPhoneNumber();
}
/**
* 显示用户信息
*/
public void show(){
System.out.println("userName:"+userName);
System.out.println("password:"+password);
System.out.println("phone:"+phoneNumber);
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
- 测试代码
// 创建Originator
UserInfoOriginator originator=new UserInfoOriginator();
// 创建管理者
Caretaker caretaker=new Caretaker();
originator.setUserName("Jackson");
originator.setPassword("123456");
originator.setPhoneNumber("18310056896");
System.out.println("-----初始状态----");
originator.show();
// 保存状态
caretaker.setMemoto(originator.saveMemoto());
// 修改状态
originator.setPassword("25268522");
originator.setPhoneNumber("18598653256");
System.out.println("-----修改后状态----");
originator.show();
//恢复状态
originator.restoreMemoto(caretaker.getMemoto());
System.out.println("-----回复后状态----");
originator.show();
- 备忘录管理者
负责存储备忘录,UserInfoOriginator创建的备忘录对象通过set方法保存在此,恢复数据时通过get方法获取备忘录对象,在此类中,不能对备忘录对对象进行修改,只能传递备忘录对象。
public class Caretaker {
private Memoto mMemoto;
public Memoto getMemoto() {
return mMemoto;
}
public void setMemoto(Memoto memoto) {
mMemoto = memoto;
}
}
运行结果

四 优缺点
优点
- 给用户提供了一种可以恢复状态的机制,可以使用户比较方便地回到某个历史状态
- 实现了信息的封装,用户无需关心状态的保存细节
缺点
- 消耗资源,如果类的成员变量过多,势必会占用比较大的资源。
网友评论