0

假设我有一个游戏类:

Public class Game{
    private Board board;
    private Stack<Command> commandStack;
    //...
    //constructor... 
    //...
    Public void createCommamd() {
        Command command = new Command(board);
        command.exec();
        commandStack.push(command);
} 
    public void undo() {
        Command command = commandStack.get(undoRedoPointer);
        board = command.unexec();
        undoRedoPointer--;
}
      public void redo(){
        undoRedoPointer++;
        Command command = commandStack.get(undoRedoPointer);
        command.exec();
}

一个将板作为构造函数参数来初始化其字段的 Command 类:

public class Command{
    private Board board;
    private Memento memento;

    public Command(Board board){
       this.board = board;
    }

    public void exec(){
        memento = new Memento();
        memento.setState(board);
        board.addColumn(col);
    }

    public void unexec(){
        board = memento.getState();
    }
}

还有我的小纪念品类,旨在在每次更改之前保存董事会的状态(它有点支持它):

public class Memento{
  private Object boardState;

  public Board getState(){
    return (Board) boardState;
  }

  public void setState(Board board){
      Object obj = board;
      this.boardState = DeepCopy.copy(obj);
  }
}

问题是我的撤消方法不会将我在游戏中的棋盘状态重置为存储在堆栈中特定命令的备忘录中的状态。应该这样做是因为我将 Command 中的 board 设置为 memento 中的备用板,并且由于 Command 中的 board 是 Game 中的 board 的引用,因此后者也应该更改。

我认为这正在发生,因为当我说

    board = memento.getState();

我实际上是说棋盘现在指向另一个引用,因此它将不再与游戏中的棋盘有任何关系。

如果我的假设是正确的,你知道我如何让游戏中的棋盘像纪念品中的棋盘一样吗?

PS我已经简化了课程,我希望我能体面地解释我的问题。

4

1 回答 1

0

unexec 方法应该返回一个板:

public class Command{
    private Board board;
    private Memento memento;

    public Command(Board board){
       this.board = board;
    }

    public void exec(){
        memento = new Memento();
        memento.setState(board);
        board.addColumn(col);
    }

    public Board unexec(){
        board = memento.getState();
        return board;
    }
}
于 2019-11-30T17:53:27.950 回答