Memento

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该状态恢复到原先保存的状态。

要保存的细节封装到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

posted @ 2012-07-27 14:51  Kyle_Java  阅读(389)  评论(0编辑  收藏  举报