设计模式之备忘录模式(二)

接上一篇适配器模式的剧情,老王和小王不知不觉玩超级玛丽玩到了23:00,
设计模式之备忘录模式(二)_第1张图片
这时老王考虑到自己第二天要上班,小王要上学,不能再玩了,于是乎和小王讨论,要关闭游戏,但是小王坚决不同意,因为马上就快通关了,不想重头再打一次,老王这时候突然想到,小霸王有一个功能是能记录游戏状态,老王找到游戏保存的功能,但是小王有点不相信老王,于是乎老王给小王展示了归档和记录的细节。
1、游戏内的归档和读档

/**
 * 游戏本身记录按钮
 */
class SuperMarieGame {

    /** 待保存的游戏关卡 */
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    /**
     * 记录游戏关卡
     * @return 小霸王记录的对象
     */
    public GamePlayerMemento recordMemento() {
        return new GamePlayerMemento(state);
    }

    /**
     * 从小霸王记录中获取并归档
     * @param memento
     */
    public void getStateFromMemento(GamePlayerMemento memento) {
        state = memento.getState();
    }
}

2、小霸王的归档

/**
 * 小霸王记录
 */
class GamePlayerMemento {

    private String state;

    public GamePlayerMemento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

3、小霸王的内部记录工具

/**
 * 小霸王内部记录工具
 */
class MementoUtil {

    private List<GamePlayerMemento> result = new ArrayList<>();

    public void add(GamePlayerMemento memento) {
        result.add(memento);
    }

    public GamePlayerMemento get(int index) {
        return result.get(index);
    }
}

然后老王操作了几次,并给小王展示出了操作的效果

public static void main(String[] args) {
        SuperMarieGame game = new SuperMarieGame();
        MementoUtil mementoUtil = new MementoUtil();
        game.setState("第一关");
        game.setState("第二关");
        mementoUtil.add(game.recordMemento());
        game.setState("第三关");
        mementoUtil.add(game.recordMemento());
        game.setState("第四关");
        mementoUtil.add(game.recordMemento());

        System.out.println("当前保存记录: " + game.getState());

        game.getStateFromMemento(mementoUtil.get(0));
        System.out.println("第一次保存记录: " + game.getState());

        game.getStateFromMemento(mementoUtil.get(1));
        System.out.println("第二次保存记录: " + game.getState());

        game.getStateFromMemento(mementoUtil.get(2));
        System.out.println("第三次保存记录: " + game.getState());

    }

设计模式之备忘录模式(二)_第2张图片
最后小王放心的睡了
设计模式之备忘录模式(二)_第3张图片
缺陷:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
优点:降低系统保存旧状态时的耦合度,比如我要保存魂斗罗的状态,新增代码如下,完全不需要修改已存在的代码

/**
 * 游戏本身记录按钮
 */
class ContraGame {

    /** 待保存的游戏关卡 */
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    /**
     * 记录游戏关卡
     * @return 小霸王记录的对象
     */
    public GamePlayerMemento recordMemento() {
        return new GamePlayerMemento(state);
    }

    /**
     * 从小霸王记录中获取并归档
     * @param memento
     */
    public void getStateFromMemento(GamePlayerMemento memento) {
        state = memento.getState();
    }
}

主方法:

public static void main(String[] args) {
        
        SuperMarieGame game = new SuperMarieGame();
        ContraGame contraGame = new ContraGame();
        MementoUtil mementoUtil = new MementoUtil();
        game.setState("超级玛丽 第一关");
        game.setState("超级玛丽 第二关");
        mementoUtil.add(game.recordMemento());
        game.setState("超级玛丽 第三关");
        mementoUtil.add(game.recordMemento());
        game.setState("超级玛丽 第四关");
        mementoUtil.add(game.recordMemento());

        contraGame.setState("魂斗罗 第一关");
        contraGame.setState("魂斗罗 第二关");
        mementoUtil.add(contraGame.recordMemento());
        contraGame.setState("魂斗罗 第三关");
        mementoUtil.add(contraGame.recordMemento());
        contraGame.setState("魂斗罗 第四关");
        mementoUtil.add(contraGame.recordMemento());

        System.out.println("当前保存记录: " + game.getState());
        game.getStateFromMemento(mementoUtil.get(0));
        System.out.println("第一次保存记录: " + game.getState());
        game.getStateFromMemento(mementoUtil.get(1));
        System.out.println("第二次保存记录: " + game.getState());
        game.getStateFromMemento(mementoUtil.get(2));
        System.out.println("第三次保存记录: " + game.getState());

        System.out.println("当前保存记录: " + contraGame.getState());
        contraGame.getStateFromMemento(mementoUtil.get(3));
        System.out.println("第一次保存记录: " + contraGame.getState());
        contraGame.getStateFromMemento(mementoUtil.get(4));
        System.out.println("第二次保存记录: " + contraGame.getState());
        contraGame.getStateFromMemento(mementoUtil.get(5));
        System.out.println("第三次保存记录: " + contraGame.getState());

    }

你可能感兴趣的:(设计模式之备忘录模式(二))