备忘录模式

应用场景


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

类关系图


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方式的备忘录
  • 多状态备忘录模式
  • 多备份备忘录

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

原文地址:https://www.cnblogs.com/xidongyu/p/5831780.html