Memento 未在 Java 中使用撤消更新状态

Memento not update state with undo in Java

我有一个 graph 包含 verticesedges 我有一个 originator class 包含 graphgraph

中习惯insert verticesget the list of vertices

界面vertex

public interface Vertex<V> {
    public V element();
}

界面edge

public interface Edge<E, V> {
    public E element();
    public Vertex<V>[] vertices();
}

interface graph with Inserts a new vertex and other method is hide()

public interface Graph<V, E> {
  public void insertVertex(V vElement);
  public Iterable<Vertex<V>> vertices();
}

ADT Graph 存储 vertices(和边缘,但不需要)

集合的实现
public class GraphEdgeList<V, E> implements Graph<V, E> {
    private Map<V, Vertex<V>> vertices;

    public GraphEdgeList() {
        this.vertices = new HashMap<>();
    }

    @Override
    public void insertVertex(V vElement) {
     //method to insert new vertex element
     //not need to return nothing
    }

    @Override
    public Iterable<Vertex<V>> vertices() {
    //return a list of vertices in graph
    }
}

class Memento

public class Memento {
    private Graph graph;

    public Memento(Originator originator) {
        graph = originator.getGraph();
    }

    public Graph getGraph() {
        return graph;
    }
}

class Originator

public class Originator<V,E> {
    private Graph<V,E> graph;
    private Caretaker caretaker;

    public Originator(Caretaker caretaker) {
      this.graph = new GraphEdgeList();
      this.caretaker = caretaker;
    }

    public Memento createMemento() {//create new memento
        return new Memento(this);
    }

    public void setMemento(Memento memento) {//set memento
       graph = memento.getGraph();
    }

    public Graph getGraph() {
      return graph;
    }

    public Caretaker getCaretaker() {
     return caretaker;
    }
}

界面IMemento

public interface IMemento {
    public void save(Originator originator);
    public void restore(Originator originator);
}

class CareTaker 实现接口 IMemento

public class Caretaker implements IMemento {

    private final Stack<Memento> undoMemento;//stack explicit

    public Caretaker() {
        this.undoMemento = new StackDynamic();
    }

    @Override
    public void save(Originator originator) {
        Memento memento = originator.createMemento();
        undoMemento.push(memento);
    }

    @Override
    public void restore(Originator originator) {
        if (undoMemento.isEmpty() != true) {
            Memento memento = undoMemento.pop();
            originator.setMemento(memento);
       }
    }
}

我的疑虑是在保存状态后开始的,当尝试执行 撤消 时,graph 没有更新到之前的状态

public class Main {
    public static void main(String[] args) {
        Caretaker caretaker = new Caretaker();
        Originator<String, String> originator = new Originator(caretaker);

        //create new string and insert in graph
        originator.getGraph.insertVertex("A");
        //caretaker save state
        caretaker.save(originator);

       //create another string and insert in graph
        originator.getGraph.insertVertex("B");
        //caretaker save state
        caretaker.save(originator);      
    }
}

但是当我恢复时 graph 仍然有 2 个顶点

caretaker.restore(originator);

有什么建议吗?

您在 Memento 中引用了相同的顶点集合。

尝试更改以下内容类:

public class Originator<V,E> {
    private Graph<V,E> graph;
    private Caretaker caretaker;

    public Originator(Caretaker caretaker) {
      this.graph = new GraphEdgeList();
      this.caretaker = caretaker;
    }

    public Originator(Originator<V, E> originator) {
         this.graph = new GraphEdgeList((GraphEdgeList) originator.getGraph());
         this.caretaker = originator.getCaretaker();
    }

    public Memento createMemento() {//create new memento
        return new Memento(new Originator(this));
    }

    public void setMemento(Memento memento) {//set memento
       graph = memento.getGraph();
    }

    public Graph getGraph() {
      return graph;
    }

    public Caretaker getCaretaker() {
     return caretaker;
    }
}

查看新的构造函数。

public class GraphEdgeList<V, E> implements Graph<V, E> {
    private Map<V, Vertex<V>> vertices;

    public GraphEdgeList() {
        this.vertices = new HashMap<>();
    }

    public GraphEdgeList(GraphEdgeList graph) {
         this.vertices = new HashMap<>();
         this.vertices.putAll(graph.getVertices());
    }

    @Override
    public void insertVertex(V vElement) {
        this.vertices.put(vElement, null);
    }

    public Map<V, Vertex<V>> getVertices() {
        return vertices;
    }

    public void setVertices(Map<V, Vertex<V>> vertices) {
        this.vertices = vertices;
    }

    @Override
    public Iterable<Vertex<V>> vertices() {
        return this.vertices.values();
    }

    @Override
    public String toString() {
        return "GraphEdgeList [vertices=" + vertices + "]";
    } 
}