备忘录模式(memento)
定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象回复到原先保存的状态。
UML图
角色说明
备忘录(Memento)角色
(1)将发起人(Originator)对象的内战状态存储起来。备忘录可以根据发起人对象的判断来决定存储多少发起人(Originator)对象的内部状态。
(2)备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。
发起人(Originator)角色
(1)创建一个含有当前的内部状态的备忘录对象。
(2)使用备忘录对象存储其内部状态。
负责人(Caretaker)角色
(1)负责保存备忘录对象。
(2)不检查备忘录对象的内容。
例子
发起人角色
package com.csdhsm.pattemdesign.memento; /** * @Title: Originator.java * @Description: 发起人类 * @author: Han * @date: 2016年6月25日 下午8:26:03 */ 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 setMemento(Memento memento) { state = memento.getState(); } public void show() { System.out.println("State " + state); } }
备忘录类
package com.csdhsm.pattemdesign.memento; /** * @Title: Memento.java * @Description: 备忘录类 * @author: Han * @date: 2016年6月25日 下午8:26:26 */ public class Memento { private String state; public Memento(String state) { this.state = state; } public String getState() { return state; } }
管理者类
package com.csdhsm.pattemdesign.memento; /** * @Title: Caretaker.java * @Description: 管理者类 * @author: Han * @date: 2016年6月25日 下午8:27:30 */ public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
客户端
package com.csdhsm.pattemdesign.memento; public class Solution { public static void main(String[] args) { Originator o = new Originator(); //Originator初始状态,状态属性为"On" o.setState("On"); o.show(); Caretaker c = new Caretaker(); //将状态备份 c.setMemento(o.createMemento()); //状态更换为Off o.setState("Off"); o.show(); o.setMemento(c.getMemento()); o.show(); } }
结果
OK,成功!
总结
备忘录模式的优点:
(1)将对象状态备份,便于在出现意外时进行状态回滚。
(2)对象状态的副本交由管理器(Caretaker)管理,发起人无需管理状态的备份。而在还原状态时,又由发起人自己执行状态还原方法,外界无法获取发起人的备份状态信息从而保证了备份数据的安全性。
备忘录模式的缺点:
将对象状态备份会占用较多的系统资源。