备忘录模式 详解

定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态;

行为型模式

角色

  • 发起人角色(Originator):记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据;
  • 备忘录角色(Memento):负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态;
  • 管理者角色(Caretaker):对备忘录 进行管理,保存和提供备忘录;

从网上找到的例图
enter image description here


适用场景

  • 需要保存一个对象在某一个时刻的状态或者部分状态;
  • 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态;

例子

  • 这个就像你写代码,当你不小心删除了几行代码,这个时候你只需要command + z 就可以返回,这就像备忘录模式,系统帮你保存之前的状态;

实现代码

/**
 * Created by George on 16/7/16.
 */
// 发起角色
var Originator = function () {
    this.getState = function () {
        return this.state;
    };
    this.setState = function (state) {
        this.state = state;
    };
    this.createMemento = function () {
        return new Memento(this.state);
    };
    this.restoreMemento = function (memento) {
        this.setState(memento.getState());
    };
};

// 备忘录
var Memento = function (state) {
    this.state = state;

    this.getState = function () {
        return this.state;
    };

    this.setState = function (state) {
        this.state = state;
    };
};

// 负责人角色
var Caretaker = function () {
    this.memento = null;
    this.getMemento = function () {
        return this.memento;
    };

    this.setMemento = function (memento) {
        this.memento = memento;
    };
};

var originator = new Originator();
originator.setState("状态1 ");
console.log("初始状态 " + originator.getState());

var caretaker = new Caretaker();
caretaker.setMemento(originator.createMemento());
originator.setState("状态2 ");

console.log("改变后状态 " + originator.getState());

originator.restoreMemento(caretaker.getMemento());

console.log("恢复状态 " + originator.getState());

实现结果:
这里写图片描述


优缺点

  1. 当发起人角色中的状态改变的时候,可以还原到之前的状态;
  2. 备份的状态是保存在发起人角色之外的,这样发起人角色就不需要对各个备份的状态进行管理;

注意的是

  1. 备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是不叫严重的;
posted @ 2016-11-07 09:55  banananana  阅读(185)  评论(0编辑  收藏  举报