备忘录模式
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可将该对象恢复到原先保存的状态。
备忘录模式概念有几个关键词:不破坏封装性、捕获内部状态、保存在对象之外、恢复原先保存的状态。
我们先来设想一个场景:我们假设有一个流程程序,顺序是开始→流程1→流程2→流程3→流程4→结束,假设我们运行到某一步了,我想将程序恢复到上一步的状态,我们可以用备忘录模式来实现,我们先看一下备忘录模式的类图:
FlowOriginator:原发器,就是要被保存状态的对象,这里只是以私有的state字段意思了一下要被保存的状态,私有代表不破坏封装性,实际运用中能要保存的对象要复杂的多,可能是一个对象或多个对象。
FlowMemetoImpl:实现了备忘录接口FlowMemeto的备忘录实现,注意这里的备忘录FlowMemetoImpl是被实现成立原发器的私有内部类,不让外部访问。主要用来存储原发器的内部状态,但具体存储哪些数据是由原发器在方法createMemeto创建备忘录对象时决定的,恢复状态也是由原发器在方法setMemeto中实现的。备忘录只负责被动的保存原发器的内部状态。
FlowCareTaker:备忘录管理者,主要负责保存和管理备忘录对象,但不能对备忘录对象的内容进行操作和检查。
这个例子中备忘录管理者FlowCareTaker可能保存了多个备忘录FlowMemetoImpl(每个备忘录可能保存了一个原发器的状态,如流程1的状态,流程2的状态等等),那么就可以通过FlowCareTaker的retriveMemeto方法返回某个备忘录,然后通过原发器FlowOriginator的setMemeto方法使原发器恢复到某个状态。
备忘录管理者保存的备忘录对象,可以根据需要自行决定保存的位置,在saveMemeto方法中可以保存到文件中、XML中、数据库中,然后在retriveMemeto方法中从相应的位置取出某个备忘录对象给原发器的setMemeto方法来恢复状态。
这样体现了使用外部对象来保存状态的一个好处,我们完全可以实现多个备忘录对象,然后根据需要进行不同的保存,如保存到文件的备忘录管理者,保存到数据库的备忘录管理者。
部分客户端代码:
public static void main(string[] args) { //创建原发器 FlowOriginator originator=new FlowOriginator(); //创建备忘录管理者 FlowCareTaker taker=new FlowCareTaker(); //运行流程1 originator.step1(); //保存流程1的状态 FlowMemento state1=originator.createMemeto(); taker.saveMemeto(state1); //运行流程2 originator.step2(); //保存流程2的状态 FlowMemento state2=originator.createMemeto(); taker.saveMemeto(state2); //运行流程3 originator.step3(); //保存流程3的状态 FlowMemento state3=originator.createMemeto(); taker.saveMemeto(state3); //获取流程1的状态,并使原发器恢复到流程1的状态 FlowMemento state1=taker.retriveMemeto(1); originator.setMemetor(state1); }