备忘录模式--如果再回到从前
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
备忘录模式应用场景:Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的只是众多属性中的一小部分时,Originator(发起人)可以根据保存的Memento信息还原到前一状态。一些对象的内部信息必须要存在对象以外的地府,但是必须要由对象自己读取,这时,使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来,从而可以且当地保持封装的边界。
感觉最大的作用还是在当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将这个状态复原。
Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻他的内部状态,并可使用备忘录回复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。
1 /** 2 * 发起人Originator类 3 * @author 贤元 4 * 5 */ 6 public class Originator { 7 //需要保存的属性,可能有多个 8 private String state; 9 10 //创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象。 11 public Memento createMemento(){ 12 return new Memento(state); 13 } 14 15 //恢复备忘录,将Memento导入并将相关数据恢复 16 public void setMemento(Memento memento){ 17 state = memento.getState(); 18 } 19 20 //显示数据 21 public void show(){ 22 System.out.println("state="+state); 23 } 24 25 26 27 public String getState() { 28 return state; 29 } 30 31 public void setState(String state) { 32 this.state = state; 33 } 34 35 36 }
Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
1 //备忘录memento类 2 public class Memento { 3 private String state; 4 5 //构造方法,将相关数据导入 6 public Memento(String state){ 7 this.state = state; 8 } 9 10 //需要保存的数据属性,可以是多个 11 public String getState() { 12 return state; 13 } 14 15 16 }
Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。
1 //管理者 2 public class Caretaker { 3 private Memento memento; 4 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 class Client { 2 public static void main(String[] args) { 3 //发起人 4 Originator o = new Originator(); 5 o.setState("原初始状态-On");//Originator初始状态,状态属性为"On" 6 o.show();//state=原初始状态-On 7 8 //管理者 9 Caretaker c = new Caretaker(); 10 //保存状态时,由于有了很好的封装,可以隐藏Originator的实现细节 11 c.setMemento(o.createMemento());//o.CreateMemento()表示创建一个备忘录,并将发起人的数据保存在备忘录中 12 13 //originator发起人改变了状态属性为"Off" 14 o.setState("改变后的状态Off"); 15 o.show();//state=改变后的状态Off 16 17 //恢复原初始状态 18 o.setMemento(c.getMemento()); 19 o.show();//state=原初始状态-On 20 } 21 }
UML图:
不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简练更加容易维护、容易扩展和复用,只有这样才可以真正得到提高
--《来自大话设计模式》