概述
Memento模式,也叫备忘录模式,是行为模式之一,他的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态.
备忘录模式的应用场景
如果一个对象需要保存状态,并可以通过undo或rollback等操作恢复到之前的状态时,可以使用备忘录模式
- 一个类需要保存他的对象状态(相当于originator角色)
- 设计一个类用来保存上述对象的状态,这个类的属相要和要备份的类属性结构一致提供getset方法(相当于memento角色)
- 在这个需要保存他的类中提供保存备份的方法,和恢复方法
备忘录模式的角色和职责
originator 原生者 需要被保存状态以便恢复的对象
memento 备忘录 该对象由originator 创建主要用来保存originator
caretaker 管理者 负责在适当的时间保存恢复originator对象
originator 类
package cn.bufanli.designPatterns.pojo;
/**
* @author BuShuangLi
* @date 2019/4/18
*/
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;
}
/**
* 创建备份方法
* @return
*/
public Memento creatMemento(){
Memento memento = new Memento();
memento.setAge(age);
memento.setName(name);
memento.setSex(sex);
return memento;
}
/**
* 恢复备份方法
* @return
*/
public void setMemento(Memento memento){
this.name=memento.getName();
this.age=memento.getAge();
this.sex=memento.getSex();
}
get&&set&&toString 略
}
memento
package cn.bufanli.designPatterns.pojo;
/**
* @author BuShuangLi
* @date 2019/4/18
*/
public class Memento {
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String sex;
/**
* 年龄
*/
private int age;
get&&set 略
}
Caretaker
package cn.bufanli.designPatterns.pojo;
/**
* @author BuShuangLi
* @date 2019/4/18
*/
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
package cn.bufanli.designPatterns;
import cn.bufanli.designPatterns.pojo.Caretaker;
import cn.bufanli.designPatterns.pojo.Memento;
import cn.bufanli.designPatterns.pojo.Person;
import org.junit.Test;
/**
* @author BuShuangLi
* @date 2019/4/18
* 设计模式--备忘录模式originator
*/
public class MementoTest {
/**
* 原始
*/
@Test
public void test01() {
//实例化对象
Person person = new Person("张三", "男", 20);
//保存内部状态
Person backUp = new Person();
backUp.setName(person.getName());
backUp.setAge(person.getAge());
backUp.setSex(person.getSex());
System.out.println(person.toString());
//修改
person.setAge(30);
System.out.println(person.toString());
//回滚 还原
person.setAge(backUp.getAge());
System.out.println(person.toString());
}
/**
* 加入备份类Memento
*/
@Test
public void test02() {
//实例化对象
Person person = new Person("张三", "男", 20);
//创建备份类
Memento memento = person.creatMemento();
System.out.println(person.toString());
//修改
person.setAge(1);
person.setSex("女");
person.setName("李思");
System.out.println(person.toString());
//恢复
person.setMemento(memento);
System.out.println(person.toString());
}
/**
* 加入管理者后的Caretaker
*/
@Test
public void test03() {
//实例化对象
Person person = new Person("张三", "男", 20);
//创建管理者
Caretaker caretaker = new Caretaker();
//设置备忘录
caretaker.setMemento(person.creatMemento());
System.out.println(person.toString());
//修改
person.setAge(1);
person.setSex("女");
person.setName("李思");
System.out.println(person.toString());
//恢复
person.setMemento(caretaker.getMemento());
System.out.println(person.toString());
}
}