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

接上一篇适配器模式的剧情,老王和小王不知不觉玩超级玛丽玩到了23:00,
在这里插入图片描述
这时老王考虑到自己第二天要上班,小王要上学,不能再玩了,于是乎和小王讨论,要关闭游戏,但是小王坚决不同意,因为马上就快通关了,不想重头再打一次,老王这时候突然想到,小霸王有一个功能是能记录游戏状态,老王找到游戏保存的功能,但是小王有点不相信老王,于是乎老王给小王展示了归档和记录的细节。
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());

    }

在这里插入图片描述
最后小王放心的睡了
在这里插入图片描述
缺陷:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
优点:降低系统保存旧状态时的耦合度,比如我要保存魂斗罗的状态,新增代码如下,完全不需要修改已存在的代码

/**
 * 游戏本身记录按钮
 */
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());

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值