撤銷功能的實現——備忘錄模式(四)
21.4 實現多次撤銷
Sunny軟體公司開發人員通過使用備忘錄模式實現了中國象棋棋子的撤銷操作,但是使用上述程式碼只能實現一次撤銷,因為在負責人類中只定義一個備忘錄物件來儲存狀態,後面儲存的狀態會將前一次儲存的狀態覆蓋,但有時候使用者需要撤銷多步操作。如何實現多次撤銷呢?本節將提供一種多次撤銷的解決方案,那就是在負責人類中定義一個集合來儲存多個備忘錄,每個備忘錄負責儲存一個歷史狀態,在撤銷時可以對備忘錄集合進行逆向遍歷,回到一個指定的歷史狀態,而且還可以對備忘錄集合進行正向遍歷,實現重做(Redo)操作,即取消撤銷,讓物件狀態得到恢復。
改進之後的中國象棋棋子撤銷功能結構圖如圖21-5所示:
在圖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列。 |
|
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 撤銷功能的實現——備忘錄模式(五)模式
- 撤銷功能的實現——備忘錄模式(三)模式
- 撤銷功能的實現——備忘錄模式(二)模式
- 撤銷功能的實現——備忘錄模式(一)模式
- 設計模式——命令模式實現撤銷設計模式
- 在Swift中實現撤銷功能Swift
- 備忘錄模式模式
- iOS設計模式之四:備忘錄模式和命令模式iOS設計模式
- 設計模式----備忘錄模式設計模式
- 設計模式 - 備忘錄模式設計模式
- 設計模式學習筆記(十八)備忘錄模式及其實現設計模式筆記
- 撤銷和回退的實現
- 探究 canvas 繪圖中撤銷(undo)功能的實現方式Canvas繪圖
- 備忘錄模式(Memento)模式
- JavaMementoPattern(備忘錄模式)Java模式
- 19_備忘錄模式模式
- 『現學現忘』Git基礎 — 23、Git中的撤銷操作Git
- 行為型模式:備忘錄模式模式
- Java備忘錄模式(Memento模式)Java模式
- 設計模式(十九):備忘錄模式設計模式
- 設計模式之備忘錄模式設計模式
- WPF備忘錄四(事件動畫)事件動畫
- 第 22 章 備忘錄模式模式
- 簡說設計模式——備忘錄模式設計模式
- 設計模式 - 備忘錄模式 ( Memento )設計模式
- 極簡設計模式-備忘錄模式設計模式
- GoLang設計模式11 - 備忘錄模式Golang設計模式
- Python設計模式-備忘錄模式Python設計模式
- 大話設計模式—備忘錄模式設計模式
- Android備忘錄《單例模式》Android單例模式
- 設計模式漫談之備忘錄模式設計模式
- java設計模式-備忘錄模式(Memento)Java設計模式
- 23種設計模式之備忘錄模式設計模式
- Qt中的撤銷/重做功能QT
- 菜鳥初學Java的備忘錄(四) (轉)Java
- 折騰Java設計模式之備忘錄模式Java設計模式
- 設計模式 | 備忘錄模式及典型應用設計模式
- 19.java設計模式之備忘錄模式Java設計模式