#java #memento
Вопрос:
Я пытаюсь сохранить вектор и использовать метод отмены для восстановления вектора с помощью шаблона на память, но это не работает. Caretaker.java:
import java.util.*; public class Caretaker { private Vector lt;Mementogt; undoList= new Vectorlt;Mementogt;(); public Caretaker() {} public void saveMyClass(MyClass mc){ undoList.add(new Memento(mc)); } public void undo(){ undoList.lastElement().restore(); undoList.remove(undoList.lastElement()); } }
Memento.java:
public class Memento { private MyClass myclass; private Vector mState; public Memento(MyClass mc) { this.myclass=mc; mState=mc.state; } public void restore() { myclass.state=this.mState; } }
MyClass.java:
public class MyClass { Vector state=new Vectorlt;gt;(); public MyClass() { } public Vector getState(){ return state; } public void doAction(int i){ state.add(i); } }
TestMemento.java:
public static void main(String args[]) { Caretaker ct = new Caretaker(); MyClass mc = new MyClass(); System.out.println("Create a my class object with state 1"); System.out.println("Current state : " mc.getState()); ct.saveMyClass(mc); mc.doAction(3); System.out.println("Change my class object to state 2"); System.out.println("Current state : " mc.getState()); ct.saveMyClass(mc); mc.doAction(5); System.out.println("Change my class object to state 3"); System.out.println("Current state : " mc.getState()); ct.saveMyClass(mc); mc.doAction(7); System.out.println("Change my class object to state 4"); System.out.println("Current state : " mc.getState()); ct.undo(); System.out.println("Perform undo"); System.out.println("Current state : " mc.getState()); ct.undo(); System.out.println("Perform undo"); System.out.println("Current state : " mc.getState()); } }
Результат:
Current state : [] Change my class object to state 2 Current state : [3] Change my class object to state 3 Current state : [3, 5] Change my class object to state 4 Current state : [3, 5, 7] Perform undo Current state : [3, 5, 7] Perform undo Current state : [3, 5, 7]
В результате я предпочитаю перейти в предыдущее состояние после отмены. Но это не работает. В той же ситуации я изменил вектор на состояние int
public void doAction(){ state ; }
Тогда я смогу получить результат
Create my class object with state 1 Current state : 0 Change my class object to state 2 Current state: 1 Change my class object to state 3 Current state: 2 Change my class object to state 4 Current state : 3 Perform undo Current state: 2 Perform undo Current state: 1
Комментарии:
1. Вы должны клонировать или копировать свои объекты, чтобы сохранить их в своем классе запоминающего устройства. В настоящее время вы сохраняете только указатели, если я прав. Например, MState=новый вектор(mc. состояние)
2. Это работает! Большое спасибо