java设计模式-备忘录模式
模式导读:
生活中存在很多这样类似的场景,打开ps新建项目搞完一半程序失去响应接着直接强行卡退,当我们重新打开ps时会发现它还没丢失,它的状态被保存了下来,或者我们电脑为了安全新建还原点,若是出现问题我们可以通过这个还原点使我们的电脑回到还原点之前的那个状态,备份加回退这便是备忘录模式。
参考类图:
代码实现:
1.首先新建一个实体类用于信息存储,同时定义备份和还原的方法
1 package com.etc; 2 //学生信息存储实体类 3 public class Student { 4 //学生姓名,编号,所属班级 5 private String sname; 6 private String sid; 7 private String className; 8 9 //构造器 10 public Student(String sname, String sid, String className) { 11 super(); 12 this.sname = sname; 13 this.sid = sid; 14 this.className = className; 15 } 16 public String getSname() { 17 return sname; 18 } 19 public void setSname(String sname) { 20 this.sname = sname; 21 } 22 public String getSid() { 23 return sid; 24 } 25 public void setSid(String sid) { 26 this.sid = sid; 27 } 28 public String getClassName() { 29 return className; 30 } 31 public void setClassName(String className) { 32 this.className = className; 33 } 34 35 @Override 36 public String toString() { 37 return "姓名:"+sname+" "+"编号:"+sid+" "+"班级名称:"+className; 38 } 39 //定义一个备忘的方法 40 public Memento memento() { 41 return new Memento(this); 42 } 43 44 //恢复数据,恢复成备忘录记录的值 45 public void recovery(Memento m) { 46 this.sname=m.getSname(); 47 this.sid=m.getSid(); 48 this.className=m.getClassName(); 49 } 50 51 }
2.定义备忘录类,保存学生实体类的信息
1 package com.etc; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.util.Properties; 8 9 //备忘录类 10 public class Memento { 11 private String sname; 12 private String sid; 13 private String className; 14 15 //保存学生信息 16 public Memento(Student s) { 17 super(); 18 this.sname =s.getSname(); 19 this.sid = s.getSid(); 20 this.className = s.getClassName(); 21 //新建xml文件用来保存每一次备忘的内容 22 Properties p=new Properties(); 23 p.setProperty("学生姓名", sname); 24 p.setProperty("学生编号", sid); 25 p.setProperty("班级名称", className); 26 try { 27 p.storeToXML(new FileOutputStream(new File("文件3.xml")), "测试文件","GBK"); 28 } catch (FileNotFoundException e) { 29 e.printStackTrace(); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } 33 34 } 35 36 public String getSname() { 37 return sname; 38 } 39 public void setSname(String sname) { 40 this.sname = sname; 41 } 42 public String getSid() { 43 return sid; 44 } 45 public void setSid(String sid) { 46 this.sid = sid; 47 } 48 public String getClassName() { 49 return className; 50 } 51 public void setClassName(String className) { 52 this.className = className; 53 } 54 55 }
3.管理者类,保持对备忘录类的引用,可以用list容器来存放多个备忘点
1 package com.etc; 2 3 //管理者 4 public class Manager { 5 //保持对备忘录类的引用 6 private Memento memento; 7 8 public Memento getMemento() { 9 return memento; 10 } 11 12 public void setMemento(Memento memento) { 13 this.memento = memento; 14 } 15 16 17 }
4.客户端类
1 package com.etc; 2 3 public class Client { 4 5 public static void main(String[] args) { 6 7 Manager m=new Manager(); 8 Student s=new Student("张三","123","软件一班"); 9 //信息打印 10 System.out.println(s.toString()); 11 //备份 12 System.out.println("-->进行备份---"); 13 m.setMemento(s.memento()); 14 15 //重置数据 16 s.setSname("李四"); 17 s.setSid("456"); 18 s.setClassName("软件二班"); 19 System.out.println("-->数据发生改变----"); 20 System.out.println(s.toString()); 21 //恢复数据 22 System.out.println("-->回到备份点----"); 23 s.recovery(m.getMemento()); 24 System.out.println(s.toString()); 25 26 } 27 28 }
效果截图:
备忘录模式优缺点:
优点:
1、提供了一种可以恢复状态的机制,能够比较方便地回到某个历史的状态。
2、实现了信息的封装,不需要关心状态的保存细节。
缺点:
消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
适用场景:
1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。