个人理解:
1. 备忘录模式又叫做快照模式,是对象的行为模式。
2. 备忘录功能:
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。
3. 备忘录角色模式角色:
发起人(Originator):记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
备忘录(Memento):负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
管理角色(Caretaker):对备忘录进行管理,保存和提供备忘录。
4. 发起人Originator创建备忘录,存储于管理角色Caretaker中,数据恢复由管理角色Caretaker获取备份录Memento的进行,备忘录Memento仅负责存储需要备份的属性值
5. 示例代码:
备忘录Memento:
public class Memento { private Map<String, String> propertyValueMap; public Memento(Map<String, String> propertyValueMap) { this.propertyValueMap = propertyValueMap; } public Map<String, String> getPropertyValueMap() { return propertyValueMap; } public void setPropertyValueMap(Map<String, String> propertyValueMap) { this.propertyValueMap = propertyValueMap; } }
管理角色Caretaker:
public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
发起人Originator:
public class Originator { protected Map<String, String> propertyValue = new HashMap<>(); public Map<String, String> getPropertyValue() { return propertyValue; } public void setPropertyValue(Map<String, String> propertyValue) { this.propertyValue = propertyValue; } public Memento createMemento(){ return new Memento(propertyValue); } public void restoreMemento(Memento memento){ setPropertyValue(memento.getPropertyValueMap()); } }
客户端调用:
private void memorandum(){ /** * 初始化血量&&法力值 */ String bloodVolume = "350"; String mana = "120"; Map<String, String> valueMap = new HashMap<>(); valueMap.put("bloodVolume", bloodVolume); valueMap.put("mana", mana); /** * 初始化中娅的沙漏 * 发起者 Originator * 管理者 Caretaker */ Originator originator = new Originator(); originator.setPropertyValue(valueMap); Caretaker caretaker = new Caretaker(); caretaker.setMemento(originator.createMemento()); Log.i("memorandum", "----------------血量:" + valueMap.get("bloodVolume") + "&& 法力值:" + valueMap.get("bloodVolume") + "-----------------"); /** * 改变血量&&法力值,作对比 */ valueMap.put("bloodVolume", "血量值不可读取"); valueMap.put("mana", "法力值不可读取"); Log.i("memorandum", "----------------血量:" + valueMap.get("bloodVolume") + "&& 法力值:" + valueMap.get("bloodVolume") + "-----------------"); /** * 恢复血量&&法力值 */ valueMap = caretaker.getMemento().getPropertyValueMap(); Log.i("memorandum", "----------------血量:" + bloodVolume + "&& 法力值:" + mana + "-----------------"); }
6. 执行结果:
01-19 17:02:20.669 917-917/? I/memorandum: ----------------血量:350&& 法力值:350-----------------
01-19 17:02:20.669 917-917/? I/memorandum: ----------------血量:血量值不可读取&& 法力值:血量值不可读取-----------------
01-19 17:02:20.669 917-917/? I/memorandum: ----------------血量:350&& 法力值:120-----------------