备忘录模式:又称快照模式。
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。它的用以是在不破坏封装条件下 将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来某个时候把这个对象还原到存储起来的状态。
它有三个角色:
发起人(Originator)角色的职责:
1.创建一个含有当前的内部状态的备忘录对象。
2.使用备忘录对象存储其内部状态。
package com.javapatterns.memento.theory; public class Originator { private String state; public Memento createMemento() { return new Memento(state); } public void restoreMemento(Memento memento) { this.state = memento.getState(); } public String getState() { return this.state; } public void setState(String state) { this.state = state; System.out.println("Current state = " + this.state); } }
备忘录(Memento)角色的职责:
1.将发起人(Originator)对象的内部状态存储起来。
2.保护其内容不被发起人(Originator)对象之外的任何对象所读取。提供了两个等效的接口:
窄接口:负责人(Caretaker)对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄接口(narrow interface),这个窄接口只允许它把备忘录对象传给其他的对象。
宽接口:发起人(Originator)对象可以看到一个宽接口(wide interface),这个宽接口允许它读取所有的数据,以便根据这些数据恢复发起人对象的内部状态。
package com.javapatterns.memento.theory; public class Memento { private String state; public Memento(String state) { this.state = state; } public String getState() { return this.state; } public void setState(String state) { this.state = state; } }
负责人(Caretaker)角色的职责:
1.负责保存备忘录对象。
2.不查看或修改备忘录对象的内容。
package com.javapatterns.memento.theory; public class Caretaker { /** * @link aggregation * @label narrow */ private Memento memento; public Memento retrieveMemento() { return this.memento; } public void saveMemento(Memento memento) { this.memento = memento; } }
客户端:
package com.javapatterns.memento.theory; public class Client { private static Originator o = new Originator(); private static Caretaker c = new Caretaker(); public static void main(String[] args) { o.setState("On"); // Store internal state c.saveMemento( o.createMemento() ); // Continue changing originator o.setState("Off"); // Restore saved state o.restoreMemento( c.retrieveMemento() ); } }
上面这个负责人只能保存单个快照,使用下面这个类 可以保存多个状态:
package com.javapatterns.memento.theory; import java.util.Vector; //多记录集(记录管理) public class Caretaker2 { private Originator originator; private Vector<Memento> mementos = new Vector<Memento>(); private int total; public Caretaker2(Originator originator) { this.originator = originator; total = 0; } public void createMemento() { // 创建 Memento memento = this.originator.createMemento(); mementos.addElement(memento); total++; } public void saveMemento(Memento memento) {// 保存记录 mementos.addElement(memento); total++; } public void retrieveMemento(int index) { // 获取 Memento memento = (Memento) mementos.elementAt(index); originator.restoreMemento(memento); } public void removeMemento(int index) {// 删除 mementos.removeElementAt(index); total--; } }