保存某個對象內部狀態的拷貝,使得之後就能夠將該對象恢復到原先的狀態。數據庫
結構:測試
(1)源發器類 Originatorthis
負責建立一個備忘錄 Memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。spa
(2)備忘錄類 Mementocode
負責存儲 Originator 對象的內部狀態,並可防止 Originator 之外的其餘對象訪問備忘錄 Memento 。對象
(3)負責人類 CareTakeblog
負責保存備忘錄 Memento 。遊戲
1 /** 2 * 備忘錄類 3 * @author CL 4 * 5 */ 6 public class EmpMemento { 7 private String name; 8 private int age; 9 private double salary; 10 11 public EmpMemento(Employee emp) { 12 this.name = emp.getName(); 13 this.age = emp.getAge(); 14 this.salary = emp.getSalary(); 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 public double getSalary() { 34 return salary; 35 } 36 37 public void setSalary(double salary) { 38 this.salary = salary; 39 } 40 41 }
1 /** 2 * 源發器類 3 * @author CL 4 * 5 */ 6 public class Employee { 7 private String name; 8 private int age; 9 private double salary; 10 11 public Employee(String name, int age, double salary) { 12 this.name = name; 13 this.age = age; 14 this.salary = salary; 15 } 16 17 /** 18 * 進行備忘操做,並返回備忘錄對象 19 * @return 20 */ 21 public EmpMemento memento() { 22 return new EmpMemento(this); 23 } 24 25 /** 26 * 進行數據恢復,恢復成指定備忘錄對象的值 27 */ 28 public void recovery(EmpMemento emt) { 29 this.name = emt.getName(); 30 this.age = emt.getAge(); 31 this.salary = emt.getSalary(); 32 } 33 34 public String getName() { 35 return name; 36 } 37 38 public void setName(String name) { 39 this.name = name; 40 } 41 42 public int getAge() { 43 return age; 44 } 45 public void setAge(int age) { 46 this.age = age; 47 } 48 49 public double getSalary() { 50 return salary; 51 } 52 53 public void setSalary(double salary) { 54 this.salary = salary; 55 } 56 57 }
1 /** 2 * 負責人類 3 * @author CL 4 * 5 */ 6 public class CareTaker { 7 8 private EmpMemento memento; 9 10 //能夠經過容器,增長多個備忘點 11 // private List<EmpMemento> list = new ArrayList<EmpMemento>(); 12 13 public EmpMemento getMemento() { 14 return memento; 15 } 16 17 public void setMemento(EmpMemento memento) { 18 this.memento = memento; 19 } 20 21 }
測試:事務
1 /** 2 * 測試備忘錄模式 3 * @author CL 4 * 5 */ 6 public class Client { 7 8 public static void main(String[] args) { 9 CareTaker ct = new CareTaker(); 10 11 Employee emp = new Employee("曹磊", 23, 8000); 12 System.out.println("第一次打印對象:"+emp.getName()+"---"+emp.getAge() 13 +"---"+emp.getSalary()); 14 15 //備忘一次 16 ct.setMemento(emp.memento()); 17 18 //修改源發器類的值 19 emp.setName("Tom"); 20 emp.setAge(99); 21 emp.setSalary(123456); 22 23 System.out.println("第二次打印對象:"+emp.getName()+"---"+emp.getAge() 24 +"---"+emp.getSalary()); 25 26 //恢復到備忘錄對象保存的狀態 27 emp.recovery(ct.getMemento()); 28 29 System.out.println("第三次打印對象:"+emp.getName()+"---"+emp.getAge() 30 +"---"+emp.getSalary()); 31 32 } 33 }
控制檯輸出:開發
第一次打印對象:曹磊---23---8000.0 第二次打印對象:Tom---99---123456.0 第三次打印對象:曹磊---23---8000.0
注意:本例子中只設置了一個備忘點,當經過容器設置多個備忘點時,就能夠實現 Word 中 Ctrl + Z 和 Ctrl + Y 的操做。
(1)棋類遊戲中的悔棋操做;
(2)Office 中的撤銷、恢復功能;
(3)數據庫軟件中事務管理的回滾操做;
(4)Photoshop 軟件中的歷史記錄;
(5)…………