Memento在Java中不使用撤消更新状态
我有一个包含顶点和边的图,还有一个originator类,它包含了应该用来插入顶点或获取图中顶点列表的图 界面顶点 使用插入新顶点的接口图,其他方法是隐藏Memento在Java中不使用撤消更新状态,java,design-patterns,memento,Java,Design Patterns,Memento,我有一个包含顶点和边的图,还有一个originator类,它包含了应该用来插入顶点或获取图中顶点列表的图 界面顶点 使用插入新顶点的接口图,其他方法是隐藏 public interface Graph<V, E> { public void insertVertex(V vElement); public Iterable<Vertex<V>> vertices(); } 班级纪念品 班级发起人 类管理员实现接口IMemento 但当我恢复de图时,
public interface Graph<V, E> {
public void insertVertex(V vElement);
public Iterable<Vertex<V>> vertices();
}
班级纪念品
班级发起人
类管理员实现接口IMemento
但当我恢复de图时,仍然有两个顶点
caretaker.restore(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 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 + "]";
}
}
因为不更新图形,所以只更新堆栈,所以它不会在originator.getGraph中反映它method@dkb,当我创建memento公共MementoOriginator发起人{graph=originator.getGraph;}memento图是receive the graph of originator,当我还原memento public void SetMementomento 2 memento{this.graph=memento.getGraph;}时,originator图是receive the memento图,也就是说,它的作用相反,尽管我不知道这是否是最好的解决方案
public class Memento {
private Graph graph;
public Memento(Originator originator) {
graph = originator.getGraph();
}
public Graph getGraph() {
return graph;
}
}
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;
}
}
public interface IMemento {
public void save(Originator originator);
public void restore(Originator originator);
}
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);
}
}
}
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);
}
}
caretaker.restore(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 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 + "]";
}
}