Java - Memento pattern and Undo

后端 未结 1 1384
猫巷女王i
猫巷女王i 2021-01-07 05:10

I am implementing an undo/redo function which requires me to use memento pattern.

The flow of the partial program : \"...the program then store the previous Vector u

相关标签:
1条回答
  • 2021-01-07 05:48

    The memento pattern is used to save the state of an object without knowing it's internal data structures.

    I try to explain it with an Iterator example

    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");
        }
    }
    

    A client can now save any state of the iterator without knowing how the iterator internally manages it's state.

    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);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题