備忘錄模式-Memento Pattern(Java實現)

備忘錄模式-Memento Pattern

Memento備忘錄設計模式是一個保存另一個對象內部狀態拷貝的對象,這樣之後就能夠將該對象恢復到之前保存的狀態。java

本文中的場景: 有一款遊戲能夠隨時存檔, 存檔完成後就能夠讀取檔案裏的數據, 而後下次開機就能夠從那個時間點繼續玩遊戲了.設計模式

    有一個小孩經過存檔的機制發現了一個竅門: 他每玩一下子游戲, 就看看他在遊戲中是掙錢了仍是虧本了dom

    若是掙錢了那就趕忙存檔; 若是賠錢了, 那就趕忙關機, 從上一個存檔從新開始.this

這樣, 這個小孩就作到了只賺不賠,哈哈哈, 接下來看看這個備忘錄模式吧.設計

Gamer類

這是遊戲者類, 是備忘錄的被做用對象.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 + "]";
    }
}

Memento類

備忘錄類, 用此類來存Gamer類的備份信息.對象

/**
 * 備忘錄,存檔, 或者叫快照
 */
public class Memento {
    // 存檔中的金額
    private int money;

    public int getMoney() {
        return money;
    }

    public Memento(int money) {
        this.money = money;
    }
}

Main

此處用於模擬場景, 運行程序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("");
        }
    }
}

運行結果比較長, 取一段典型的部分展現出來:遊戲

 

相關文章
相關標籤/搜索