標籤:.com 拷貝 next 建立 恢複 system image 玩遊戲 static
備忘錄模式-Memento Pattern
Memento備忘錄設計模式是一個儲存另外一個對象內部狀態拷貝的對象,這樣以後就可以將該對象恢複到以前儲存的狀態。
本文中的情境: 有一款遊戲可以隨時存檔, 存檔完成後就可以讀取檔案裡的資料, 然後下次開機就可以從那個時間點繼續玩遊戲了.
有一個小孩通過存檔的機制發現了一個竅門: 他每玩一會兒遊戲, 就看看他在遊戲中是掙錢了還是虧本了
如果掙錢了那就趕緊存檔; 如果賠錢了, 那就趕緊關機, 從上一個存檔重新開始.
這樣, 這個小孩就做到了只賺不賠,哈哈哈, 接下來看看這個備忘錄模式吧.
Gamer類
這是遊戲者類, 是備忘錄的被作用對象.
import java.util.*;/** * 遊戲主人公 */public class Gamer { private static final Random random = new Random(); /** * 所持遊戲金額 */ private int money; public Gamer(int money) { this.money = money; } public int getMoney() { // 擷取當前所持金錢 return money; } public void bet() { int dice = random.nextInt(3) + 1; if (dice == 1) { money += 100; System.out.println("所持金錢增加了。"); } else if (dice == 2) { money -= random.nextInt(money - 1) + 1; System.out.println("所持金錢減少了。"); } else { System.out.println("什麼都沒有發生。"); } } // 建立備忘錄, 作為快照 public Memento createMemento() { return new Memento(money); } // 使用備忘錄來進行恢複資料 public void restoreMemento(Memento memento) { this.money = memento.getMoney(); } public String toString() { return "[money = " + money + "]"; }}Memento類
備忘錄類, 用此類來存Gamer類的備份資訊.
/** * 備忘錄,存檔, 或者叫快照 */public class Memento { // 存檔中的金額 private int money; public int getMoney() { return money; } public Memento(int money) { this.money = money; }}Main
此處用於類比情境, 運行程式
import Memento.Sample.game.Gamer;import Memento.Sample.game.Memento;public class Main { public static void main(String[] args) { // 最初的所持金錢數為100 Gamer gamer = new Gamer(100); // 儲存最初的狀態 Memento memento = gamer.createMemento(); for (int i = 0; i < 10; i++) { // 顯示當前是第幾次迴圈 System.out.println("==== " + i); // 顯示主人公現在的金錢數 System.out.println("目前狀態:" + gamer); // 進行遊戲 gamer.bet(); System.out.println("所持金錢為" + gamer.getMoney() + "元。"); // 決定如何處理Memento, // 如果金幣增加, 那麼就繼續 // 如果金幣減少了, 那麼就從備忘錄中擷取 if (gamer.getMoney() > memento.getMoney()) { System.out.println(" (所持金錢增加了,因此儲存遊戲當前的狀態)"); memento = gamer.createMemento(); } else if (gamer.getMoney() < memento.getMoney()) { System.out.println(" (所持金錢減少了,因此將遊戲恢複至以前的狀態)"); gamer.restoreMemento(memento); System.out.println(" (恢複之後的金錢為:" + gamer.getMoney() + "元)"); } System.out.println(""); } }}
運行結果比較長, 取一段典型的部分展示出來:
備忘錄模式-Memento Pattern(Java實現)