zoukankan      html  css  js  c++  java
  • 备忘录模式

    应用场景


    备忘录的作用就是将已经发生的事情做一个记录,以方便以后浏览。具体定义是在不破化封装的情况下,捕获一个对象的内部状态并在该对象之外保存这个状态,以后可以将该对象恢复到原先保存的状态的。

    类关系图


    Originator: 发起人角色

      记录当前时刻的内部状态,负责定义那些属于备份范围的状态,负责创建和恢复备忘录中的数据

    Memento备忘录角色

      负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态

    Caretaker:备忘录管理员角色

      对备忘录进行管理/保存和提供备忘录

    示例代码


     备忘录类

    备忘录类其实就是一JavaBean,对外只提供get和set方法。

    class Memento{
        //发起人的内部状态
        private String state = "";
        
        public Memento(String _state){
            this.state = _state;
        }
        
        public String getState(){
            return state;
        }
        
        public void setState(String _state){
            this.state = _state;
        }
    }

    备忘录管理员

    需要备忘录管理是因为可能存在多个备忘录,这个的管理员里面应该有个容器来存储备忘录,为了编程方便,这里只放一个存储。

    class Caretaker{
        //备忘录对象
        private Memento memento;
        
        public Memento getMemento(){
            return memento;
        }
        
        public void setMemento(Memento memento){
            this.memento = memento;
        }
    }

    发起人

    class Originator{
        //内部状态
        private String state = "";
        
        public String getState(){
            return state;
        }
        
        public void setState(String state){
            this.state = state;
        }
        
        //创建一个备忘录
        public Memento createMemento(){
            return new Memento(this.state);
        }
        
        public void restoreMemento(Memento _memento){
            this.setState(_memento.getState());
        }
    }

    场景类

    class Client{
        public static void main(String[] args) {
            Originator originator = new Originator();
            originator.setState("当前状态是:0");
            Caretaker caretaker = new Caretaker();
            //定义备忘录
            caretaker.setMemento(originator.createMemento());
            //恢复备忘录
            originator.restoreMemento(caretaker.getMemento());
        }
    }

    总结


    备忘录为我们提供数据恢复的可能性,但是在备忘录的生命周期以及备忘录的性能上要做权衡,把重要的部分进行备忘。当然,备忘录有以下的变种。

    • clone方式的备忘录
    • 多状态备忘录模式
    • 多备份备忘录

    我们可以根据不同的场景来使用不同的备忘录模式。

  • 相关阅读:
    数论-FTT 和 NTT
    数论-FFT高精度乘法
    树链剖分-模板题 HAOI2015
    图论-最小生成树模板
    图论-次短路求法
    图论-某图论专练 Round3 (April, 2018)
    动规-某动规专练 Round1 (April, 2018)
    动规-某动规专练 Round2 (April, 2018)
    Java IO: 并发IO
    Java IO: Reader And Writer
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5831780.html
Copyright © 2011-2022 走看看