Memento備忘錄設計模式是一個保存另一個對象內部狀態拷貝的對象,這樣之後就能夠將該對象恢復到之前保存的狀態。java
本文中的場景: 有一款遊戲能夠隨時存檔, 存檔完成後就能夠讀取檔案裏的數據, 而後下次開機就能夠從那個時間點繼續玩遊戲了.設計模式
有一個小孩經過存檔的機制發現了一個竅門: 他每玩一下子游戲, 就看看他在遊戲中是掙錢了仍是虧本了dom
若是掙錢了那就趕忙存檔; 若是賠錢了, 那就趕忙關機, 從上一個存檔從新開始.this
這樣, 這個小孩就作到了只賺不賠,哈哈哈, 接下來看看這個備忘錄模式吧.設計
這是遊戲者類, 是備忘錄的被做用對象.rest
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 + "]"; } }
備忘錄類, 用此類來存Gamer類的備份信息.對象
/** * 備忘錄,存檔, 或者叫快照 */ public class Memento { // 存檔中的金額 private int money; public int getMoney() { return money; } public Memento(int money) { this.money = money; } }
此處用於模擬場景, 運行程序blog
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(""); } } }
運行結果比較長, 取一段典型的部分展現出來:遊戲