备忘录模式
备忘录这个名词,相信我们已经很熟悉了,比如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信息还原到前一状态。
例如,如果在系统中需要实现撤销这样的功能时,那么备忘录模式就派上用场了。有时一些对象的内部信息必须保存在对象以外的地方,但是又必须由对象自己读取,这时,备忘录模式可以把复杂对象的内部信息对其他的对象屏蔽起来。
每天都要对自己清零,每天都要进步,哪怕只有一点点