当前位置: 首页 > 面试题库 >

Java-Memento模式和撤消

万承志
2023-03-14
问题内容

我正在实现撤消/重做功能,这需要我使用记忆模式。

局部程序的流程:“
…该程序然后使用Memento模式存储先前的Vector,然后将新创建的对象添加到Vector。此后,用户可以选择show命令来显示Vector内部的内容。
,他还可以输入undo命令来还原,还原可以重复进行,直到还原到原始状态为止。”

从我的研究中,我知道将会有一个创始者,纪念品和看守。

这是我的看守程序

public class CareTaker {
      private Memento m;
      private Stack s;
      private Vector v;
      // Some of the implementation are not shown

      public void create() {
            // Some of the implementation are not shown
            // Assuming Vector is named "v"
            // Passing Vector to memento
            m = new Memento(v);
            s.add(m);
      }
      public void undo() {
          v = s.pop().restore();
      }
}
public class Memento {
    private Vector _v;
    public Memento(Vector v) {
      _v = v;
    }
    public Vector restore() {
      return _v;
    }
}

不幸的是,我未能确定“发起人”,也无法确定将是谁。如果没有发起者,此代码片段是否曾经是正确的Memento模式?


问题答案:

记忆模式用于保存对象的状态,而无需了解其内部数据结构。

我尝试用一​​个Iterator例子来解释

public class MementoListIterator<E> implements Iterator<E> {

    public static class Memento {

        private int savedIndex;

        private Memento(MementoListIterator<?> mementoListIterator) {
            this.savedIndex = mementoListIterator.index;
        }

    }

    private List<E> elements;

    private int index = 0;

    public MementoListIterator(List<E> elements) {
        this.elements = elements;
    }

    public Memento save() {
        return new Memento(this);

    }

    public void restore(Memento memento) {
        this.index = memento.savedIndex;
    }

    @Override
    public boolean hasNext() {
        return this.index < elements.size();
    }

    @Override
    public E next() {
        return elements.get(index++);
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("Not implemented yet");
    }
}

客户端现在可以保存迭代器的任何状态,而无需知道迭代器如何内部管理其状态。

public class Main {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C", "D", "E");
        MementoListIterator<String> mementoListIterator = new MementoListIterator<String>(
                list);

        Memento initialState = mementoListIterator.save();

        while (mementoListIterator.hasNext()) {
            String string = mementoListIterator.next();
            System.out.println(string);
        }
                    // Normally we can not re-use the iterator, but
                    // fortuanatly we saved the initial state.

        // restore the initial state and we can use the Iterator again
        mementoListIterator.restore(initialState);

        while (mementoListIterator.hasNext()) {
            String string = mementoListIterator.next();
            System.out.println(string);
        }
    }
}


 类似资料:
  • 备忘录模式捕捉并且具象化一个对象的内在状态。换句话说,它把你的对象存在了某个地方,然后在以后的某个时间再把它恢复出来,而不会打破它本身的封装性,私有数据依旧是私有数据。

  • 本文向大家介绍C++设计模式之备忘录模式(Memento),包括了C++设计模式之备忘录模式(Memento)的使用技巧和注意事项,需要的朋友参考一下 当我们在实际应用中需要提供撤销机制,当一个对象可能需要再后续操作中恢复其内部状态时,就需要使用备忘录模式。其本质就是对象的序列化和反序列化的过程,支持回滚操作。 作用 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样

  • 问题内容: 我正在对Memento模式进行一些研究,而我通常对行为模式还是陌生的,而随着我的研究,我变得非常困惑。我一直感到困惑的主要事情之一是Memento模式和序列化之间的差异。 据我所知,两者都可以用来存储对象,并在以后将它们带回去,但是我无法就它们之间的主要区别找到明确的答案,也许我错过了一些研究成果但我想知道是否有人可以阐明两者之间的区别。 谢谢 问题答案: 通常,Memento模式用于

  • 归档 - Archiving 苹果通过归档的方法来实现备忘录模式。它把对象转化成了流然后在不暴露内部属性的情况下存储数据。你可以读一读 《iOS 6 by Tutorials》 这本书的第 16 章,或者看下苹果的归档和序列化文档。 如何使用归档 首先,我们需要让 Album 实现 NSCoding 协议,声明这个类是可被归档的。打开 Album.swift 在 class 那行后面加上 NSCo

  • Memento定义:memento 是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态。 Memento 模式相对也比较好理解,我们看下列代码: public class Originator { private int number; private File file = null; public Originator() { }

  • 如何使用备忘录模式 在 ViewController.swift 里加上下面两个方法: //MARK: Memento Pattern func saveCurrentState() { // When the user leaves the app and then comes back again, he wants it to be in the exact same state