备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该状态恢复到原先保存的状态。
要保存的细节封装到Memento中,哪一天要更改保存的细节也不用影响客户端了。
备忘录模式所涉及的角色有三个:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色。
1 //备忘录,负责记录Originator的状态,并防止Originator以外其它对象访问。 2 public class Memento { 3 4 private int attack; 5 private int defense; 6 7 public Memento(int attack, int defense){ 8 this.attack = attack; 9 this.defense = defense; 10 } 11 12 public int getAttack() { 13 return attack; 14 } 15 16 public int getDefense() { 17 return defense; 18 } 19 20 }
1 //角色类 2 public class Originator { 3 4 private int attack; 5 private int defense; 6 7 public Originator(){ 8 attack = 100; 9 defense = 50; 10 } 11 12 public int getAttack() { 13 return attack; 14 } 15 16 public void setAttack(int attack) { 17 this.attack = attack; 18 } 19 20 public int getDefense() { 21 return defense; 22 } 23 24 public void setDefense(int defense) { 25 this.defense = defense; 26 } 27 28 //保存角色状态 29 public Memento createMemento(){ 30 return new Memento(attack, defense); 31 } 32 33 //恢复角色状态 34 public void recoveryMemento(Memento memento){ 35 attack = memento.getAttack(); 36 defense = memento.getDefense(); 37 } 38 39 public void show(){ 40 System.out.println("攻击力 : " + attack); 41 System.out.println("防御力 : " + defense); 42 } 43 }
1 //管理者,负责保存好Memento,不能对备忘录内容进行操作和检查。 2 public class Caretaker { 3 4 private Memento memento; 5 6 public Memento getMemento() { 7 return memento; 8 } 9 10 public void setMemento(Memento memento) { 11 this.memento = memento; 12 } 13 14 }
1 public static void main(String[] args) { 2 Originator o = new Originator(); 3 o.setAttack(2000); 4 o.setDefense(150); 5 o.show(); 6 7 Caretaker c = new Caretaker(); 8 c.setMemento(o.createMemento()); 9 10 o.setAttack(50); 11 o.setDefense(0); 12 o.show(); 13 14 o.recoveryMemento(c.getMemento()); 15 o.show(); 16 17 }
打印结果:
攻击力 : 2000
防御力 : 150
攻击力 : 50
防御力 : 0
攻击力 : 2000
防御力 : 150