JAVA设计模式-备忘录模式-Memento-游戏备份存档

来源:互联网 发布:sql 身份证号与岁数 编辑:程序博客网 时间:2024/06/14 01:28
19. Memento(备忘录)

clip_image019
意图:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

适用性:
必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

解释:
这个貌似没啥可以解释的= =

实现:
实现一个有两个存档的"game"类
oringinator
class Game {    int life = 0;    int mana = 0;    Game(int life, int mana) {        this.life = life;        this.mana = mana;    }    void action(int dLife, int dMana) {        this.life += dLife;        this.mana += dMana;    }    void output() {        System.out.println("生命" + life + ",魔法" + mana);    }    //存档    GameState save() {        return new GameState(this);    }    //读档    void load(GameState gameState) {        gameState.getState(this);    }}

mementor
class GameState {    private int life;    private int mana;    GameState(Game game) {        life = game.life;        mana = game.mana;    }    void setState(Game game) {        life = game.life;        mana = game.mana;    }    void getState(Game game) {        game.life = life;        game.mana = mana;    }}

caretaker
class StateManager {    private GameState gameState1;    private GameState gameState2;    GameState getGameState1() {        return gameState1;    }    void setGameState1(GameState gameState1) {        this.gameState1 = gameState1;    }    GameState getGameState2() {        return gameState2;    }    void setGameState2(GameState gameState2) {        this.gameState2 = gameState2;    }}

测试:
    public static void main(String[] args) {        Game game = new Game(100, 100);        StateManager stateManager=new StateManager();        //此时状态 生命100,魔法100        game.output();        //保存状态1 生命100,魔法100        stateManager.setGameState1(game.save());        game.action(-100, -100);        //此时状态  生命0,魔法0        game.output();        //保存状态2 生命0,魔法0        stateManager.setGameState2(game.save());        //读取状态1 生命100,魔法100        game.load(stateManager.getGameState1());        //此时状态 生命100,魔法100        game.output();        //读取状态2 生命0,魔法0        game.load(stateManager.getGameState2());        //此时状态 生命0,魔法0        game.output();    }