备忘录模式(二十一)
备忘录模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
介绍
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
如何解决:通过一个备忘录类专门存储对象状态。
关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。
应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。
优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。
注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。
package com.tzytzytzy.Memento.com.ex1; public class Person { private String name; private String sex; private int age; public Person() { } public Person(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void display() { System.out.println("name:" + name + ",sex:" + sex + ",age:" + age); } }
package com.tzytzytzy.Memento.com.ex1; public class MainClass { public static void main(String[] args) { Person per = new Person("战三","男",30); //保存内部状态 Person backup = new Person(); backup.setName(per.getName()); backup.setAge(per.getAge()); backup.setSex(per.getSex()); per.display(); per.setAge(20); per.display(); per.setName(backup.getName()); per.setSex(backup.getSex()); per.setAge(backup.getAge()); per.display(); } }
package com.tzytzytzy.Memento.com.ex2; public class Person { private String name; private String sex; private int age; public Person() { } public Person(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void display() { System.out.println("name:" + name + ",sex:" + sex + ",age:" + age); } //创建一个备份 public Memento createMemento() { return new Memento(name,sex,age); } //恢复备份 public void setMemento(Memento memento) { this.name = memento.getName(); this.sex = memento.getSex(); this.age = memento.getAge(); } }
package com.tzytzytzy.Memento.com.ex2; /** * @author Heaton * @date 2018/5/8 23:20 * @describe 记忆中的状态,备忘 */ public class Memento { private String name; private String sex; private int age; public Memento(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.tzytzytzy.Memento.com.ex2; /** * @author Heaton * @date 2018/5/8 23:28 * @describe 备份管理者 */ public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
package com.tzytzytzy.Memento.com.ex2; public class MainClass { public static void main(String[] args) { Person per = new Person("张三", "男", 24); // Memento memento = per.createMemento(); Caretaker caretaker = new Caretaker(); caretaker.setMemento(per.createMemento()); per.display(); per.setName("李四"); per.setSex("女"); per.setAge(1); per.display(); // per.setMemento(memento); per.setMemento(caretaker.getMemento()); per.display(); } }
您的资助是我最大的动力!
金额随意,欢迎来赏!