备忘录模式

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

备忘录模式概念有几个关键词:不破坏封装性、捕获内部状态、保存在对象之外、恢复原先保存的状态。

 我们先来设想一个场景:我们假设有一个流程程序,顺序是开始→流程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);
}

 

posted @ 2023-07-06 10:08  何塞穆里尼奥  阅读(13)  评论(0编辑  收藏  举报