定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
结构:(书中图,侵删)
Originator:需要备份的类(写在便签上的内容)
Memento:备份类,里面包含部分或全部Originator的属性(便签纸)
Caretaker:真正保存备份的地方(便签纸贴的地方)
实例:
替答到。我也不知道怎么就想到了这个。上课的时候,老师点名,如果你要帮同学答到,那么你就需要先将自己的名字藏起来,换成你同学的名字,等替他答完了,你再换回自己名字。(我并没有在教坏小朋友,还请同学们乖乖自己去上课)
学生类:
package designpattern.memento;
public class Student {
private String name;
// 姓名
private String major;
// 专业
private String studentNo;
// 学号
public Student(String name, String major, String studentNo) {
super();
this.name =
name;
this.major =
major;
this.studentNo =
studentNo;
}
public Memento createMemento() {
return new Memento(
this.name,
this.major);
}
public void restoreMemento(Memento memento) {
this.name =
memento.getName();
this.major =
memento.getMajor();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name =
name;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major =
major;
}
public String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo =
studentNo;
}
@Override
public String toString() {
return "Student [name=" + name + ", major=" + major + ", studentNo=" + studentNo + "]"
;
}
}
备忘录类:
package designpattern.memento;
public class Memento {
private String name;
private String major;
public Memento(String name, String major) {
super();
this.name =
name;
this.major =
major;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name =
name;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major =
major;
}
}
保存类:
package designpattern.memento;
public class CareTaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento =
memento;
}
}
客户端:
package designpattern.memento;
public class Client {
public static void main(String[] args) {
Student student =
new Student("郝鑫仁", "计算机", "1234"
);
CareTaker careTaker =
new CareTaker();
careTaker.setMemento(student.createMemento());
System.out.println(student);
System.out.println("开始点名..."
);
// 伪装成其他同学
student.setName("齐步莱"
);
student.setMajor("自动化"
);
System.out.println(student);
System.out.println("点名结束"
);
// 变回自己
student.restoreMemento(careTaker.getMemento());
System.out.println(student);
}
}
结果输出:
Student [name=郝鑫仁, major=计算机, studentNo=1234
]
开始点名...
Student [name=齐步莱, major=自动化, studentNo=1234
]
点名结束
Student [name=郝鑫仁, major=计算机, studentNo=1234]
总结:
备忘录模式就是用于临时存储类的一部分信息,以便它能回到存储前的状态。
这个我在实际应用中暂时没有遇到相关的实例,书中说到的保存游戏进度算一个,但我自己开发中暂时还没遇到。