备忘录模式

概述:

           备忘录对象是一个用来存储另一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,讲一个对象的状态捕获住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

        

备忘录模式所涉及的角色有三个:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色

  备忘录(Memento)角色

  备忘录角色又如下责任:

  (1)将发起人(Originator)对象的内战状态存储起来。备忘录可以根据发起人对象的判断来决定存储多少发起人(Originator)对象的内部状态。

  (2)备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。

  备忘录有两个等效的接口:

  ●  窄接口:负责人(Caretaker)对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄接口(narrow interface),这个窄接口只允许它把备忘录对象传给其他的对象。

  ●  宽接口:与负责人对象看到的窄接口相反的是,发起人对象可以看到一个宽接口(wide interface),这个宽接口允许它读取所有的数据,以便根据这些数据恢复这个发起人对象的内部状态。

  发起人(Originator)角色

  发起人角色有如下责任:

  (1)创建一个含有当前的内部状态的备忘录对象。

  (2)使用备忘录对象存储其内部状态。

  负责人(Caretaker)角色

  负责人角色有如下责任:

  (1)负责保存备忘录对象。

  (2)不检查备忘录对象的内容

常见的系统往往需要存储不止一个状态,而是需要存储多个状态,或者叫做有多个检查点。

  备忘录模式可以将发起人对象的状态存储到备忘录对象里面,备忘录模式可以将发起人对象恢复到备忘录对象所存储的某一个检查点上。下面给出一个示意性的、有多重检查点的备忘录模式的实现。

    

class Originator {
    private Vector states;
    private int index;
    public Originator() {
        states = new Vector<>();
        index = 0;
    }
    
    public Memenoto createMemenoto() {
        return new Memenoto(states, index);
    }
    public void restoreMemenote(Memenoto m) {
        this.states = m.getStates();
        this.index = m.getIndex();
    }
    
    public void add(String state) {
        states.addElement(state);
        index++;
    }
}

class Memenoto {
    private Vector states;
    private int index;
    public Memenoto(Vector states, int index) {
        this.states = states;
        this.index = index;
    }
    Vector getStates() {
        return states;
    }
    int getIndex() {
        return index;
    }
}
class CareTaker {
    private Originator o;
    private Vector m;
    private int c;
    public CareTaker(Originator o) {
        this.o = o;
        c = 0;
    }
    public int createMementor() {
        Memenoto me = o.createMemenoto();
        m.addElement(me);
        return c++;
    }
    public void storeMementor(int index) {
        o.restoreMemenote(m.get(index));
    }
}
View Code

 优点

          1、 给用户提供了一种可以恢复状态的机制。可以是用户能够比较方便地回到某个历史的状态。

          2、 实现了信息的封装。使得用户不需要关心状态的保存细节。

       缺点

          消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。


       五、 模式适用场景

         1、 需要保存一个对象在某一个时刻的状态或部分状态。

         2、 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态。


       六、 模式总结

       1、 备忘录模式可以实现在不破坏封装的前提下,捕获一个类的内部状态,并且在该对象之外保存该对象的状态,保证该对象能够恢复到历史的某个状态。

       2、 备忘录模式实现了内部状态的封装,除了创建它的原发器之外其他对象都不能够访问它。

       3、 备忘录模式会占用较多的内存,消耗资源。

原文地址:https://www.cnblogs.com/whesuanfa/p/7489888.html