设计模式之备忘录模式

来源:互联网 发布:c 变量定义数组长度 编辑:程序博客网 时间:2024/06/06 05:06

备忘录模式

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

这里写图片描述

备忘录模式有三个角色:

  • 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
原创粉丝点击