模式導讀:java
生活中存在不少這樣相似的場景,打開ps新建項目搞完一半程序失去響應接着直接強行卡退,當咱們從新打開ps時會發現它還沒丟失,它的狀態被保存了下來,或者咱們電腦爲了安全新建還原點,如果出現問題咱們能夠經過這個還原點使咱們的電腦回到還原點以前的那個狀態,備份加回退這即是備忘錄模式。安全
參考類圖:ide
代碼實現:測試
1.首先新建一個實體類用於信息存儲,同時定義備份和還原的方法this
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.定義備忘錄類,保存學生實體類的信息spa
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容器來存放多個備忘點code
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.客戶端類xml
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 }
效果截圖:blog
備忘錄模式優缺點:內存
優勢:
一、提供了一種能夠恢復狀態的機制,可以比較方便地回到某個歷史的狀態。
二、實現了信息的封裝,不須要關心狀態的保存細節。
缺點:
消耗資源,若是類的成員變量過多,勢必會佔用比較大的資源,並且每一次保存都會消耗必定的內存。
適用場景:
一、須要保存/恢復數據的相關狀態場景。
二、提供一個可回滾的操做。