2013-12-04 3 views
2

Я реализую функцию отмены/повтора, которая требует от меня использования шаблона памяти.Java - Memento pattern and Undo

Поток частичной программы: «... программа затем сохраняет предыдущий Вектор с использованием Memento Pattern, затем вновь созданный объект будет добавлен в вектор. После этого пользователь может выбрать команду show, чтобы показать, что находится внутри вектора, он также может вводить команду отмены для восстановления, отмена может быть повторена до тех пор, пока она не будет восстановлена ​​в исходное состояние ... »

Из моего исследования я знаю, что будет создатель, памятник и смотритель ,

Вот мой смотритель программа

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, если нет оригинатора?

ответ

4

Memento pattern используется для сохранения состояния объекта, не зная его внутренних структур данных.

Я пытаюсь объяснить это с 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); 
     } 
    } 
}