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

來源:互聯網
上載者:User

標籤:.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實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.