<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 撤銷功能的實現——備忘錄模式(四) 21.4 實現多次撤銷 Sunny軟件公司開發人員通過使用備忘錄模式實現了中國象棋棋子的撤銷操作,但是使用上述代碼只能實現一次撤銷,因為在負責人類中只定義一個備忘錄對象來保存狀態,后面保存的狀態會將前一次保存的狀態覆蓋,但有時候用戶需要撤銷多步操作。如何實現多次撤銷呢?本節將提供一種多次撤銷的解決方案,那就是在負責人類中定義一個集合來存儲多個備忘錄,每個備忘錄負責保存一個歷史狀態,在撤銷時可以對備忘錄集合進行逆向遍歷,回到一個指定的歷史狀態,而且還可以對備忘錄集合進行正向遍歷,實現重做(Redo)操作,即取消撤銷,讓對象狀態得到恢復。 改進之后的中國象棋棋子撤銷功能結構圖如圖21-5所示: ![](http://my.csdn.net/uploads/201205/02/1335892489_9232.jpg) 在圖21-5中,我們對負責人類MementoCaretaker進行了修改,在其中定義了一個ArrayList類型的集合對象來存儲多個備忘錄,其代碼如下所示: ``` import java.util.*; class MementoCaretaker { //定義一個集合來存儲多個備忘錄 private ArrayList mementolist = new ArrayList(); public ChessmanMemento getMemento(int i) { return (ChessmanMemento)mementolist.get(i); } public void setMemento(ChessmanMemento memento) { mementolist.add(memento); } } ``` 編寫如下客戶端測試代碼: ``` class Client { private static int index = -1; //定義一個索引來記錄當前狀態所在位置 private static MementoCaretaker mc = new MementoCaretaker(); public static void main(String args[]) { Chessman chess = new Chessman("車",1,1); play(chess); chess.setY(4); play(chess); chess.setX(5); play(chess); undo(chess,index); undo(chess,index); redo(chess,index); redo(chess,index); } //下棋 public static void play(Chessman chess) { mc.setMemento(chess.save()); //保存備忘錄 index ++; System.out.println("棋子" + chess.getLabel() + "當前位置為:" + "第" + chess.getX() + "行" + "第" + chess.getY() + "列。"); } //悔棋 public static void undo(Chessman chess,int i) { System.out.println("******悔棋******"); index --; chess.restore(mc.getMemento(i-1)); //撤銷到上一個備忘錄 System.out.println("棋子" + chess.getLabel() + "當前位置為:" + "第" + chess.getX() + "行" + "第" + chess.getY() + "列。"); } //撤銷悔棋 public static void redo(Chessman chess,int i) { System.out.println("******撤銷悔棋******"); index ++; chess.restore(mc.getMemento(i+1)); //恢復到下一個備忘錄 System.out.println("棋子" + chess.getLabel() + "當前位置為:" + "第" + chess.getX() + "行" + "第" + chess.getY() + "列。"); } } ``` 編譯并運行程序,輸出結果如下: ``` 棋子車當前位置為:第1行第1列。 棋子車當前位置為:第1行第4列。 棋子車當前位置為:第5行第4列。 ******悔棋****** 棋子車當前位置為:第1行第4列。 ******悔棋****** 棋子車當前位置為:第1行第1列。 ******撤銷悔棋****** 棋子車當前位置為:第1行第4列。 ******撤銷悔棋****** 棋子車當前位置為:第5行第4列。 ``` 擴展 > 本實例只能實現最簡單的Undo和Redo操作,并未考慮對象狀態在操作過程中出現分支的情況。如果在撤銷到某個歷史狀態之后,用戶再修改對象狀態,此后執行Undo操作時可能會發生對象狀態錯誤,大家可以思考其產生原因。【注:可將對象狀態的改變繪制成一張樹狀圖進行分析。】 > 在實際開發中,可以使用鏈表或者堆棧來處理有分支的對象狀態改變,大家可通過鏈表或者堆棧對上述實例進行改進。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看