1.定义
Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。
2.应用场景
如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。
- 一个类需要保存他的对象的状态(相当于Originator角色)
- 设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
- 需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
- undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态
3.备忘录模式的结构
4.备忘录模式的角色和职责
- Originator(原生者)--需要被保存状态以便恢复的那个对象。
- Memento(备忘录)--该对象由Originator创建,主要用来保存Originator的内部状态。
- Caretaker(管理者)--负责在适当的时间保存/恢复Originator对象的状态
5.代码演示
package test.com.test; /** * 原生者 (Originator) * */ public class Person { private String name; private String sex; private int age; public Person() { } public Person(String name, String sex, int age) { super(); 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 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(); } //打印状态 public void display() { System.out.println("name:" + name + ",sex:" + sex + ",age:" + age); } }
package test.com.test; /** * 备忘录(Memento) * */ public class Memento { private String name; private String sex; private int age; public Memento(String name, String sex, int age) { super(); 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 test.com.test; /** * 管理者(Caretaker) * */ public class Caretaker { private Memento memento; public Caretaker() { super(); } public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
package test.com.test; /** * 测试 * */ public class Main { 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(30); per.display(); //还原 // per.setMemento(memento); per.setMemento(caretaker.getMemento()); per.display(); } }