设计模式之备忘录模式

备忘录模式

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

这里写图片描述

备忘录模式有三个角色:

  • Originator:发起人,负责创建一个备忘录,可以记录、恢复自身的内部状态。同时Originator还可以根据需要决定Memento存储自身的哪些内部状态。
  • Memento:备忘录角色,用于存储Originator内部状态,并且可以防止Originator以外的对象访问Memento。
  • Caretaker:看管人,负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

以保存游戏进度为例,退出游戏前存档,再进入游戏就会显示退出之前的状态。

代码示例

游戏发起人类

    public class Game {
        private int point;// 当前关数

        public void play(int point) {
            this.point = point;
        }

        public State createState() {
            return new State(point, new Date().toString());
        }

        public void restoreState(State state) {
            System.out.println(state.toString());
            System.out.println("现在时间为:" + new Date().toString());
            point = state.getPoint();
        }
    }

游戏状态类

    public class State {
        private int point;
        private String date;

        public State(int point, String date) {
            super();
            this.point = point;
            this.date = date;
        }

        public int getPoint() {
            return point;
        }

        public String toString() {
            return "当前关卡:" + point + " 时间为:" + date;
        }
    }

游戏备忘录

    public class GameCaretaker {
        private State state;

        public void archive(State state) {
            this.state = state;
        }

        public State load() {
            return state;
        }
    }

客户端

    Game game = new Game();
    game.play(10);// 玩到第十关

    GameCaretaker gameCaretaker = new GameCaretaker();

    // 存档
    gameCaretaker.archive(game.createState());

    // 读档
    game.restoreState(gameCaretaker.load());

输出为:
当前关卡:10 时间为:Sat Apr 15 03:21:32 CST 2017
现在时间为:Sat Apr 15 03:21:32 CST 2017

甚至你可以管理一系列的状态,记录和撤销都可以,就像象棋每走一步就保存了当前的棋局,悔棋就是恢复上一步的棋局。总的来说,备忘录模式好处是给用户提供了一种可以恢复状态的机制,而且实现信息的封装,用户不需要关系状态的细节,但是保存的状态过多就会占用大量的资源。不足之处望指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值