备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
应用实例:
- 后悔药。
- 打游戏时的存档。
- Windows 里的 ctri + z。
- IE 中的后退。
- 数据库的事务管理。
优点:
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
UML Class Diagram
package memento.pattern.demo;
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
package memento.pattern.demo;
public class Originator {
private String state;
Memento m;
public void setState(String state) {
this.state = state;
}
//Creates memento
public Memento orginatorMemento(){
m = new Memento(state);
return m;
}
//back to state
public void Revert(Memento memento){
System.out.println("Restoring to previous state");
state = memento.getState();
System.out.println("State at present :"+ state);
}
}
package memento.pattern.demo;
public class Caretaker {
private Memento _memento;
public void saveMemento(Memento m){
_memento = m;
}
public Memento RetrieveMemento(){
return _memento;
}
}
package memento.pattern.demo;
import com.sun.org.apache.xpath.internal.operations.Or;
public class MementoPatternEx {
public static void main(String[] args) {
System.out.println("***Memento Pattern Demo***");
Originator o = new Originator();
o.setState("First state");
// HOlding Old state
Caretaker c = new Caretaker();
c.saveMemento(o.orginatorMemento());
//change state
o.setState("Second state");
//Restore saved state
o.Revert(c.RetrieveMemento());
}
}