备忘录模式

  备忘录这个名词,相信我们已经很熟悉了,比如word里面有撤销操作的功能,打游戏时我们可以保存进度等等,在软件设计中,也会用到备忘录。

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

  

  我们来看代码,首先是原始的类,里面有一个状态属性state,并且可以决定创建备忘录和恢复备忘录:

  

 1 package beiwanglu;
 2 
 3 public class Originator {
 4     private String state;
 5 
 6     public Memento createMemento() {
 7         return new Memento(state);
 8     }
 9     
10     public void setMemento(Memento memento){
11         this.state = memento.getState();
12     }
13 
14     public String getState() {
15         return state;
16     }
17 
18     public void setState(String state) {
19         this.state = state;
20     }
21     
22     public void show(){
23         System.out.println("当前状态:"+state);
24     }
25 
26 }

  然后是保存状态的对象:

 

 1 public class Memento {
 2     private String state;
 3     
 4     public Memento(String state){
 5         this.state = state;
 6     }
 7 
 8     public String getState() {
 9         return state;
10     }
11 
12     public void setState(String state) {
13         this.state = state;
14     }
15 }

  然后是保存备忘录的对象:

  

 1 public class Caretaker {
 2     private Memento memento;
 3 
 4     public Memento getMemento() {
 5         return memento;
 6     }
 7 
 8     public void setMemento(Memento memento) {
 9         this.memento = memento;
10     }
11     
12 }

  客户端调用:

  

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         Originator o = new Originator();
 4         o.setState("on");
 5         o.show();
 6         
 7         Caretaker c = new Caretaker();
 8         c.setMemento(o.createMemento());
 9         
10         o.setState("off");
11         o.show();
12         
13         o.setMemento(c.getMemento());
14         o.show();
15     }
16 }

  我们来总结一下备忘录模式使用的场合:

  memento模式比较适用于功能比较复杂的,但是需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的memento信息还原到前一状态。

  例如,如果在系统中需要实现撤销这样的功能时,那么备忘录模式就派上用场了。有时一些对象的内部信息必须保存在对象以外的地方,但是又必须由对象自己读取,这时,备忘录模式可以把复杂对象的内部信息对其他的对象屏蔽起来。

posted @ 2012-10-31 12:08  寒剑飘香  阅读(197)  评论(0编辑  收藏  举报