-
备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,在以后的某个时间点可以恢复到之前保存的状态。
-
备忘录模式的UML图
-
Originator:原发器,负责创建一个备忘录,用来记录对象当前的状态,也可以用来恢复一个对象之前的某个状态。同时原发器还可以根据需要决定Memento存储Originator的那些内部状态。Memento备忘录,用来存储Originator的内部状态,并且可以防止Memento以外的对象访问Memento。在备忘录Memento中有两个接口,Caretaker只能看到备忘录中的窄接口,它只能将备忘录传递给其他对象。Originator可以看到宽接口,允许它访问返回到先前状态的所有数据。Caretaker:负责人,负责保存好备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。
-
在备忘录模式中,最重要的就是Memento。备忘录除了原发器以外的对象都不可以访问。
-
备忘录模式的代码实现
-
创建一个原发器类(包含原发器类状态的保存和恢复)
/** * 原发器类 */ public class Role { private int blood; private int magic; public Role(int blood, int magic) { this.blood = blood; this.magic = magic; } public int getBlood() { return blood; } public void setBlood(int blood) { this.blood = blood; } public int getMagic() { return magic; } public void setMagic(int magic) { this.magic = magic; } public void display(){ System.out.println("当前状态,blood: " + this.blood +", magic: " + this.magic); } /** * 恢复备忘录 */ public void restoreMemento(RoleMemento roleMemento){ this.blood = roleMemento.getBlood(); this.magic = roleMemento.getMagic(); } /** * 创建备忘录 * @return */ public RoleMemento createMemento(){ return new RoleMemento(this.blood, this.magic); } }
-
创建一个备忘录类
/** * 备忘录类 */ public class RoleMemento { private int blood; private int magic; public RoleMemento(int blood, int magic) { this.blood = blood; this.magic = magic; } public int getBlood() { return blood; } public void setBlood(int blood) { this.blood = blood; } public int getMagic() { return magic; } public void setMagic(int magic) { this.magic = magic; } }
-
创建一个负责人类
/** * 负责人,传递备忘录并且能够保存备忘录,但是不能提供操作访问的方法 */ public class RoleCareTaker { private RoleMemento roleMemento; public RoleMemento getRoleMemento() { return roleMemento; } public void setRoleMemento(RoleMemento roleMemento) { this.roleMemento = roleMemento; } }
-
创建一个测试类
public class Test { public static void main(String[] args) { Role role = new Role(100, 100); System.out.println("==========开始存档==========="); role.display(); RoleMemento memento = role.createMemento(); RoleCareTaker roleCareTaker = new RoleCareTaker(); //存储当前备忘录 roleCareTaker.setRoleMemento(memento); //继续闯关,可能要恢复 role.setBlood(0); role.setMagic(0); System.out.println("当前能量不足" ); role.display(); role.restoreMemento(roleCareTaker.getRoleMemento()); System.out.println("===正在恢复能量===="); role.display(); } }
-
-
备忘录模式的优点
- 给用户提供了一种可以恢复历史状态的机制
- 实现信息的封装,不需要关心状态的保存细节
-
备忘录模式的缺点
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
-
备忘录模式的使用场景
- 需要保存一个对象在某个时刻的状态或部分状态
- 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态。
-
JDK中对备忘录模式的使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H0cw0bIO-1578235473533)(C:\Users\Kangs\AppData\Roaming\Typora\typora-user-images\image-20200105224404396.png)]
设计模式--备忘录模式
最新推荐文章于 2024-06-18 20:53:25 发布