zoukankan      html  css  js  c++  java
  • 备忘录模式--如果再回到从前

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

      备忘录模式应用场景: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图:

      

  • 相关阅读:
    数字配对(bzoj 4514)
    任务查询系统(bzoj 3932)
    楼房重建(bzoj 2957)
    Hotel(poj 3667)
    Can you answer these queries(spoj 1043)
    亚瑟王(bzoj 4008)
    潘多拉的盒子(bzoj 1194)
    Circling Round Treasures(codeforces 375c)
    莫队算法---基础知识介绍(转载)
    HDU 1141---Brackets Sequence(区间DP)
  • 原文地址:https://www.cnblogs.com/lixianyuan-org/p/9517849.html
Copyright © 2011-2022 走看看