模式定义
备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个对象。这样以后就可将该对象恢复到原先保存的状态。
模式结构
模式实现
发起人类
package com.bjsxt.memento;
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(state));
}
public void setMento(Memento memento){
state = memento.getState();
}
public void show(){
System.out.println("State = " + state);
}
}
备忘录类
package com.bjsxt.memento;
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;
}
}
管理者类
package com.bjsxt.memento;
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
测试类
package com.bjsxt.memento;
public class Client {
public static void main(String[] args) {
Originator o = new Originator();
o.setState("On");
o.show();
Caretaker c = new Caretaker();
c.setMemento(o.createMemento());
o.setState("Off");
o.show();
o.setMento(c.getMemento());
o.show();
}
}
使用场景
Memento模式比较适合功能比较复杂的,但需要维护或记录属性历史的类。或者需要保存的属性只是众多属性的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。
模式优缺点
优点
1、实现了信息的封装。使得用户不需要关心状态的保存细节。
2、给用户提供了一种可以恢复状态的机制。可以是用户能够比较方便地回到某个历史的状态。
缺点
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存
。
模式总结
1、备忘录模式可以实现在不破坏封装的前提下,捕获一个类的内部状态,并且在该对象之外保存该对象的状态,保证该对象能够恢复到历史的某个状态。
2、备忘录模式实现了内部状态的封装,除了创建它的原发器之外其他对象都不能够访问它。
3、备忘录模式会占用较多的内存,消耗资源。