备忘录模式java
概述:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态.这样能够将对象恢复到原先保存的状态.测试
帮助理解:备忘录模式就是为对象提供一个备份的地方,当对象想要回滚到前一个状态时,调用备忘录对象直接就能够恢复.this
备忘录模式说包含的角色spa
Originator : 原发器,也就是发起者.记录有当前时刻自身的内部状态,负责建立一个备忘录Memento,用于记录当前时刻自身的内部状态,并可以使用备忘录恢复内部状态.Originator能够根据须要决定Memento存储本身的哪些内部状态(发起者可能有不少内部状态,能够决定哪些由备忘录备份)code
Memento : 备忘录.负责存储Originator对象的内部状态,并能够防止Originator以外的其它对象访问备忘录.备忘录有两个接口.Caretaker只能看到备忘录的窄接口,他只能将备忘录对象传递给其它对象.Originator却可以看到备忘录的宽接口.容许它访问返回到先前状态所须要的全部数据.对象
Caretaker : 管理者.负责保存备忘录.可是不能对备忘录的内容进行操做和访问.只可以将备忘录传递给其它对象.接口
优势资源
有时一些发起人对象的内部信息必须保存在发起人对象之外的地方,可是必须由发起人对象本身读取.这时使用备忘录模式能够将复杂的发起人内部信息对其它对象屏蔽起来.从而能够恰当的保持封装的边界.get
备忘录模式简化了发起者类.发起者再也不须要管理和保存其内部状态的一个个版本.客户端能够自行管理他们所须要的这些状态的版本.class
当发起者角色的状态发生改变的时候.有可能这个状态无效,须要回滚到前一个状态.这时候可使用暂时存储起来的备忘录将状态进行还原.
缺点
若是发起者角色的状态有不少而且须要完整的储存到备忘录对象中.那么备忘录对象会很消耗资源.
注意事项
备忘录模式最理想的状况是只容许生成该备忘录的那个原发器可以访问这个备忘录的内部状态.
/** * 〈备忘录对象类〉 * * @author vegetate * @create 2018/11/12 17:08 */ public class MemoBean { private int useTime;//使用时间 private String deviceName;//设备名称 private int stateLevel;//状态 public int getUseTime() { return useTime; } public void setUseTime(int useTime) { this.useTime = useTime; } public String getDeviceName() { return deviceName; } public void setDeviceName(String deviceName) { this.deviceName = deviceName; } public int getStateLevel() { return stateLevel; } public void setStateLevel(int stateLevel) { this.stateLevel = stateLevel; } }
/** * 〈备忘录管理对象〉 * * @author vegetate * @create 2018/11/12 17:11 */ public class MemoManager { MemoBean memento; public MemoBean getMemento() { return memento; } public void setMemento(MemoBean memento) { this.memento = memento; } }
/** * 〈发起者对象〉 * * @author vegetate * @create 2018/11/12 17:13 */ public class MemoRole { private int useTime;// 使用时间 private String deviceName;// 设备名称 private int stateLevel;// 状态 public MemoRole(String deviceName, int useTime, int stateLevel) { super(); this.useTime = useTime; this.deviceName = deviceName; this.stateLevel = stateLevel; } public MemoRole() { } public int getUseTime() { return useTime; } public void setUseTime(int useTime) { this.useTime = useTime; } public String getDeviceName() { return deviceName; } public void setDeviceName(String deviceName) { this.deviceName = deviceName; } public int getStateLevel() { return stateLevel; } public void setStateLevel(int stateLevel) { this.stateLevel = stateLevel; } public MemoBean createMemoObject() { MemoBean memento = new MemoBean(); memento.setDeviceName(deviceName); memento.setStateLevel(stateLevel); memento.setUseTime(useTime); return memento; } public void setMemento(MemoBean memento) { this.deviceName = memento.getDeviceName(); this.stateLevel = memento.getStateLevel(); this.useTime = memento.getUseTime(); } /** * 获取对象当前状态 */ public void getCurrentState() { System.out.println("当前设备名称:" + this.deviceName + "当前使用时间:" + this.useTime + "当前工做状态:" + this.stateLevel); } }
测试类
/** * 〈测试类〉 * * @author vegetate * @create 2018/11/12 17:14 */ public class Test { public static void main(String[] args) { // 新建备忘录发起者对象 MemoRole role = new MemoRole("发电机", 0, 1); // 新建备忘录管理者 MemoManager manager = new MemoManager(); // 角色初始状态 System.out.println("机器开始发电:"); role.getCurrentState(); // 利用备忘录模式保存当前状态 System.out.println("---保存当前的机器状态---"); manager.setMemento(role.createMemoObject()); role.setDeviceName("发电机"); role.setStateLevel(5); role.setUseTime(1000); System.out.println("已经持续发电1000小时"); role.getCurrentState(); // 恢复保存的角色状态 role.setMemento(manager.getMemento()); System.out.println("恢复后发电机当前状态:"); role.getCurrentState(); } }
结果: 机器开始发电: 当前设备名称:发电机当前使用时间:0 当前工做状态:1 —保存当前的机器状态— 已经持续发电N小时 当前设备名称:发电机当前使用时间:1000 当前工做状态:5 恢复后发电机当前状态: 当前设备名称:发电机当前使用时间:0 当前工做状态1