设计模式之 Memento - 备忘录模式
Memento模式也叫备忘录模式,是由GoF提出的23种软件设计模式的一种。Memento模式是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。
本文介绍设计模式中的(Memento)模式的概念,用法,以及实际应用中怎么样使用Memento模式进行开发。
, " + org.getCount() + "]");
????????//创建目标对象的一个快照
????????Memento snapshot = org.createMemento();
????????//通过Caretaker保存此快照
????????Caretaker caretaker = new Caretaker();
????????caretaker.setMemento(snapshot);
????????//操作目标对象改变目标对象的值
????????org.append("bbb");
????????org.append("ccc");
????????System.out.println("Updated value: [" + org.getData() + ", " + org.getCount() + "]");
????????
????????//还原
????????org.setMemento(caretaker.getMemento());
????????System.out.println("Restored value: [" + org.getData() + ", " + org.getCount() + "]");
????}
}
/**
* Originator
*
*/
class Originator {
????private String data = "";
????private int count = 0;
????public void append(String expr) {
????????data += expr;
????????count++;
????}
????public String getData() {
????????return data;
????}
????public void setData(String data) {
????????this.data = data;
????}
????public Memento createMemento() {
????????return new Memento(data, count);
????}
????public void setMemento(Memento memento) {
????????data = memento.getData();
????????count = memento.getCount();
????}
????public int getCount() {
????????return count;
????}
????public void setCount(int count) {
????????this.count = count;
????}
}
/**
* Memento
*
*/
class Memento {
????private String data;
????private int count = 0;
????public Memento(String data, int count) {
????????this.data = data;
????????this.count = count;
????}
????public String getData() {
????????return data;
????}
????
????public int getCount() {
????????return count;
????}
????public void setCount(int count) {
????????this.count = count;
????}
}
/**
* Caretaker
*
*/
class Caretaker {
????Memento memento;
????public Memento getMemento() {
????????return memento;
????}
????public void setMemento(Memento memento) {
????????this.memento = memento;
????}
}
执行Client,输出结果:
C:\Memento>javac *.java
C:\Memento>java Client
Original value: [aaa, 0]
Updated value: [aaabbbccc, 2]
Restored value: [aaa, 0]
C:\Memento>
Originator对象的初始状态为[aaa, 0],经过某些操作,变为[aaabbb, 2],经过Memento模式处理之后,又复原到了[aaa, 0]。
后记:
1,Command模式也可以用来恢复对象的状态,一般Command模式可以支持多级状态的回退,Memento只是简单的恢复(一级);其实,Command模式在每一个undo中,可以使用Memento来保存对象的状态。
- Command can use Memento to maintain the state required for an undo operation. [GoF, p242]
2,从Originator对象到Memento的过程是一个对象拷贝的操作,Java语言的克隆与深层次克隆技术入门与精通 一文比较深入地介绍了对象间的拷贝技术。