一、什么是备忘录模式
Memenoto模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候恢复对象之前的状态。
(1)、首先我们来写一个事物回滚的例子
package com.renxin.moshi;
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);
}
}
创建测试类Test
package com.renxin.moshi;
public class Test {
public static void main(String[] args) {
Person per = new Person("张三","男",30);
//保存内部状态
Person backup = new Person();
backup.setName(per.getName());
backup.setSex(per.getSex());
backup.setAge(per.getAge());
per.display();
//修改
per.setAge(20);
per.display();
//回滚 还原
per.setName(backup.getName());
per.setSex(backup.getSex());
per.setAge(backup.getAge());
per.display();
}
}
控制台打印结果为:
name:张三,sex男,age30
name:张三,sex男,age20
name:张三,sex男,age30
这样的做法虽然实现了回滚,但是是不合理的!
接下来就引入了java23种设计模式之—–备忘录模式!
二、备忘录模式的应用场景:
如果一个对象需要保存状态并可以通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。
(1)、一个类需要保存他的对象的状态(相当于Originator角色)
(2)、设计一个类,该类只是用来保存上述对象的状态(相当于Memenot角色)
(3)、需要的时候,Caretaker角色要求Originator返回一个Memenot并加以保存
(4)、undo或rollback操作时,通过Caretaker保存的Memenot恢复Originator对象的状态
三、备忘录模式结构
(1)、创建Memenot
package com.renxin.moshi1;
public class Memenot {
private String name;
private String sex;
private int age;
public Memenot(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;
}
}
(2)、改造Person类,在最下面加上
//创建一个备份
public Memenot createMemenot() {
return new Memenot(name,sex,age);
}
//恢复备份,也就是还原
public void setMemenot(Memenot menot) {
this.name = menot.getName();
this.sex = menot.getSex();
this.age = menot.getAge();
}
(3)、创建测试类Test
package com.renxin.moshi1;
public class Test {
public static void main(String[] args) {
Person per = new Person("张三","男",20);
//保存内部状态
Memenot memenot = per.createMemenot();
per.display();
//修改
per.setName("李四");
per.setSex("女");
per.setAge(40);
per.display();
//回滚
per.setMemenot(memenot);
per.display();
}
}
运行结果为:
name:张三,sex男,age20
name:李四,sex女,age40
name:张三,sex男,age20
四、备忘录模式的角色和职责:
Origination(原生者这里指Person):需要被保存状态以便恢复的那个对象
Memento(备忘录):改对象由Origination创建,主要用来保存Origination的内部状态。
Caretaker(管理者):负责在适当的时间保存/恢复Origination对象的状态
创建管理者,通过管理者来负责恢复;
(1)、创建管理者类
package com.renxin.moshi1;
public class Caretaker {
private Memenot memenot;
public Memenot getMemenot() {
return memenot;
}
public void setMemenot(Memenot memenot) {
this.memenot = memenot;
}
}
(2)、改造测试类Test
package com.renxin.moshi1;
public class Test {
public static void main(String[] args) {
Person per = new Person("张三","男",20);
//保存内部状态
//Memenot memenot = per.createMemenot();
Caretaker caretaker = new Caretaker();
caretaker.setMemenot(per.createMemenot());
per.display();
//修改
per.setName("李四");
per.setSex("女");
per.setAge(40);
per.display();
//回滚
//per.setMemenot(memenot);
per.setMemenot(caretaker.getMemenot());
per.display();
}
}
举一个例子:备忘录应用最经典的的场景,就是在一个闯关游戏中,比如打到第10关的时候,有事要出去或者想保存第十关好下一次接着从第十关玩,这个时候就需要通过备忘录模式来保存当前游戏的状态!