1、什麼是備忘錄模式測試
Memento模式也叫備忘錄模式,是行爲模式之 一,它的做用是保存對象的內部狀態,並在須要 的時候(undo/rollback)恢復對象之前的狀態。this
2、備忘錄模式的應用場景spa
若是一個對象須要保存狀態並可經過undo或rollback等 操做恢復到之前的狀態時,能夠使用Memento模式。設計
1)一個類須要保存它的對象的狀態(至關於Originator角色)code
2)設計一個類,該類只是用來保存上述對象的狀態(至關於Memento角色)對象
3)須要的時候,Caretaker角色要求Originator返回一個Memento並加以保存blog
4)undo或rollback操做時,經過Caretaker保存的Memento恢復Originator對象的狀態get
3、備忘錄模式的結構class
4、備忘錄模式的角色和職責im
Originator(原生者) 須要被保存狀態以便恢復的那個對象。
Memento(備忘錄) 該對象由Originator建立,主要用來保存Originator的內部狀態。
Caretaker(管理者) 負責在適當的時間保存/恢復Originator對象的狀態。
沒使用備忘錄模式時
1 public class Person { 2 //姓名 3 private String name; 4 //性別 5 private String sex; 6 //年齡 7 private int age; 8 9 public Person() { 10 11 } 12 13 public Person(String name, String sex, int age) { 14 this.name = name; 15 this.sex = sex; 16 this.age = age; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 public String getSex() { 28 return sex; 29 } 30 31 public void setSex(String sex) { 32 this.sex = sex; 33 } 34 35 public int getAge() { 36 return age; 37 } 38 39 public void setAge(int age) { 40 this.age = age; 41 } 42 43 public void display() { 44 System.out.println("name:" + name + ",sex:" + sex + ",age:" + age); 45 } 46 }
1 public class MainClass { 2 public static void main(String[] args) { 3 Person per = new Person("lifengxing","男",30); 4 5 //保存內部狀態(備份) 6 Person backup = new Person(); 7 backup.setName(per.getName()); 8 backup.setAge(per.getAge()); 9 backup.setSex(per.getSex()); 10 11 per.display(); 12 13 //修改 14 per.setAge(20); 15 per.display(); 16 17 //回滾 還原 18 per.setName(backup.getName()); 19 per.setSex(backup.getSex()); 20 per.setAge(backup.getAge()); 21 22 per.display(); 23 24 } 25 }
=======================================================
使用備忘錄模式
人
1 public class Person { 2 //姓名 3 private String name; 4 //性別 5 private String sex; 6 //年齡 7 private int age; 8 9 public Person() { 10 11 } 12 13 public Person(String name, String sex, int age) { 14 this.name = name; 15 this.sex = sex; 16 this.age = age; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 public String getSex() { 28 return sex; 29 } 30 31 public void setSex(String sex) { 32 this.sex = sex; 33 } 34 35 public int getAge() { 36 return age; 37 } 38 39 public void setAge(int age) { 40 this.age = age; 41 } 42 43 public void display() { 44 System.out.println("name:" + name + ",sex:" + sex + ",age:" + age); 45 } 46 47 //建立一個備份 48 public Memento createMemento() { 49 return new Memento(name,sex,age); 50 } 51 52 //恢復備份,還原 53 public void setMemento(Memento memento) { 54 this.name = memento.getName(); 55 this.sex = memento.getSex(); 56 this.age = memento.getAge(); 57 } 58 }
備份
1 //備份 2 public class Memento { 3 // 姓名 4 private String name; 5 // 性別 6 private String sex; 7 // 年齡 8 private int age; 9 10 public Memento(String name, String sex, int age) { 11 this.name = name; 12 this.sex = sex; 13 this.age = age; 14 } 15 16 public String getName() { 17 return name; 18 } 19 20 public void setName(String name) { 21 this.name = name; 22 } 23 24 public String getSex() { 25 return sex; 26 } 27 28 public void setSex(String sex) { 29 this.sex = sex; 30 } 31 32 public int getAge() { 33 return age; 34 } 35 36 public void setAge(int age) { 37 this.age = age; 38 } 39 }
看守人
1 //看守人 2 public class Caretaker { 3 private Memento memento; 4 5 public Memento getMemento() { 6 return memento; 7 } 8 9 public void setMemento(Memento memento) { 10 this.memento = memento; 11 } 12 }
測試
1 public class MainClass { 2 public static void main(String[] args) { 3 Person per = new Person("lifengxing","男",24); 4 5 // Memento memento = per.createMemento(); 6 Caretaker caretaker = new Caretaker(); 7 caretaker.setMemento(per.createMemento()); 8 9 per.display(); 10 11 per.setName("beifeng"); 12 per.setSex("女"); 13 per.setAge(1); 14 15 per.display(); 16 17 per.setMemento(caretaker.getMemento()); 18 per.display(); 19 20 } 21 }