设计模式 |备忘录模式(memento)
程序员文章站
2022-03-22 11:24:22
定义: 定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 结构:(书中图,侵删) Originator:需要备份的类(写在便签上的内容) Memento:备份类,里面包含部分或全部Originator的属性(便签纸) C ......
定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
结构:(书中图,侵删)
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]
总结:
备忘录模式就是用于临时存储类的一部分信息,以便它能回到存储前的状态。
这个我在实际应用中暂时没有遇到相关的实例,书中说到的保存游戏进度算一个,但我自己开发中暂时还没遇到。