定义:在不破坏对象封装的前提下,捕获一个的对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

优点:1.可以使用能够比较方便地回到某个历史的状态

2.实现了信息的封装,使得用户不需要关心状态的保存细节

缺点:1.消耗资源

使用场景:ctrl+z键、浏览器回退。

原理:通过一个备忘录类专门存储对象状态(简单来说 就是把原来数据封装成一个实体类Memento 然后将这个实体类放在另一实体Caretaker中 当需要时 在把原来的实体取出重新使用)

类图:

备忘录模式_数据

Originator是发起人,事件内部的处理

Caretaker是管理者,用于set以前的数据 就是把原来的Memento数据放入保存

Memento是备忘录,记录数据的BO

代码模板

Memento

public class Memento {

private String state;

public Memento(String state) {
this.state = state;
}

public String getState() {
return state;
}

}

Originator

public class Originator {

private String state;

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public Memento createMento() {
return (new Memento(state));
}

public void setMemento(Memento memento) {
state = memento.getState();
}

public void show() {
System.out.println("state = " + state);
}

}

Caretaker

public class Caretaker {

private Memento memento;

public Memento getMemento() {
return memento;
}

public void setMemento(Memento memento) {
this.memento = memento;
}

}

栗子

Memento 需要保存的数据BO

public class PersonState{

private String arms; //武器
private String clothes; //衣服

public PersonState(String arms,String clothes) {
this.arms = arms;
this.clothes = clothes;
}

//get set 方法


}

Originator发起人 具体处理也业务的类

public class Originator{

private String arms; //武器
private String clothes; //衣服

//get set 方法

//新建状态
public PersonState createPersonState() {
return (new PersonState(arms,clothes));
}

public void setPersonState(PersonState personState) {
arms= personState.getArms();
clothes = personState.getClothes();

}

public void show() {
System.out.println("武器 = " + arms,"衣服=" + clothes);
}

}

Caretaker

public class Caretaker {

private PersonState personState;

public PersonState getPersonState() {
return personState;
}

public void setPersonState(PersonState personState) {
this.personState = personState;
}

}

调用

public class Client {

public static void main(String[] args) {
//初始状态
Originator originator = new Originator();
originator.setArms("木剑"); //武器
originator.setClothes("布甲"); //衣服
originator.show();

//保存上一个状态
Caretaker caretaker = new Caretaker();
caretaker.setPersonState(originator.createPersonState());

//充钱了
originator.setArms("屠龙刀"); //武器
originator.setClothes("大金链子大金表"); //衣服
originator.show();

//被人爆了
originator.setPersonState(caretaker.getMemento());
originator.show();
}

}