经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式 |备忘录模式(memento)
来源:cnblogs  作者:莫愆  时间:2019/6/4 15:46:32  对本文有异议

定义:

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

结构:(书中图,侵删)

 

Originator:需要备份的类(写在便签上的内容)
Memento:备份类,里面包含部分或全部Originator的属性(便签纸)
Caretaker:真正保存备份的地方(便签纸贴的地方)

实例:

替答到。我也不知道怎么就想到了这个。上课的时候,老师点名,如果你要帮同学答到,那么你就需要先将自己的名字藏起来,换成你同学的名字,等替他答完了,你再换回自己名字。(我并没有在教坏小朋友,还请同学们乖乖自己去上课)
 
学生类:
  1. package designpattern.memento;
  2. public class Student {
  3. private String name;// 姓名
  4. private String major;// 专业
  5. private String studentNo;// 学号
  6.  
  7. public Student(String name, String major, String studentNo) {
  8. super();
  9. this.name = name;
  10. this.major = major;
  11. this.studentNo = studentNo;
  12. }
  13. public Memento createMemento() {
  14. return new Memento(this.name, this.major);
  15. }
  16. public void restoreMemento(Memento memento) {
  17. this.name = memento.getName();
  18. this.major = memento.getMajor();
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public String getMajor() {
  27. return major;
  28. }
  29. public void setMajor(String major) {
  30. this.major = major;
  31. }
  32. public String getStudentNo() {
  33. return studentNo;
  34. }
  35. public void setStudentNo(String studentNo) {
  36. this.studentNo = studentNo;
  37. }
  38. @Override
  39. public String toString() {
  40. return "Student [name=" + name + ", major=" + major + ", studentNo=" + studentNo + "]";
  41. }
  42. }
备忘录类:
  1. package designpattern.memento;
  2. public class Memento {
  3. private String name;
  4. private String major;
  5. public Memento(String name, String major) {
  6. super();
  7. this.name = name;
  8. this.major = major;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public String getMajor() {
  17. return major;
  18. }
  19. public void setMajor(String major) {
  20. this.major = major;
  21. }
  22. }
保存类:
  1. package designpattern.memento;
  2. public class CareTaker {
  3. private Memento memento;
  4. public Memento getMemento() {
  5. return memento;
  6. }
  7. public void setMemento(Memento memento) {
  8. this.memento = memento;
  9. }
  10. }
客户端:
  1. package designpattern.memento;
  2. public class Client {
  3. public static void main(String[] args) {
  4. Student student = new Student("郝鑫仁", "计算机", "1234");
  5. CareTaker careTaker = new CareTaker();
  6. careTaker.setMemento(student.createMemento());
  7. System.out.println(student);
  8. System.out.println("开始点名...");
  9. // 伪装成其他同学
  10. student.setName("齐步莱");
  11. student.setMajor("自动化");
  12. System.out.println(student);
  13. System.out.println("点名结束");
  14. // 变回自己
  15. student.restoreMemento(careTaker.getMemento());
  16. System.out.println(student);
  17. }
  18. }
结果输出:
  1. Student [name=郝鑫仁, major=计算机, studentNo=1234]
  2. 开始点名...
  3. Student [name=齐步莱, major=自动化, studentNo=1234]
  4. 点名结束
  5. Student [name=郝鑫仁, major=计算机, studentNo=1234]

总结:

备忘录模式就是用于临时存储类的一部分信息,以便它能回到存储前的状态。
这个我在实际应用中暂时没有遇到相关的实例,书中说到的保存游戏进度算一个,但我自己开发中暂时还没遇到。

原文链接:http://www.cnblogs.com/imoqian/p/10970138.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号