备忘录模式

本文介绍了备忘录模式,一种在不破坏对象封装的前提下保存和恢复对象状态的设计模式,适用于撤销、恢复操作及数据状态管理。通过JavaScript代码示例展示了如何实现发起人、备忘录和管理者角色,并讨论了其优缺点及应用场景。
摘要由CSDN通过智能技术生成

备忘录模式

介绍

  • 备忘录模式是一种行为设计模式
  • 允许在不破坏对象封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
  • 需要保证被保存的对象状态不能被外部访问,保证内部完整性,不向外透露

核心思想

  • 在不破坏对象封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便恢复到原先保存的某个状态。

备忘录角色

  1. 发起人(Originator)- 负责创建一个含有当前的内部状态的备忘录对象,并保存到备忘录中
  2. 备忘录(Memento)- 负责存储发起人内部状态的快照,而且可以保护这些内容不被发起人对象之外的任何对象读取
  3. 管理者(Caretaker)- 负责维护发起人保存的一个或多个备忘录,并在需要回滚状态的时候提供保存了相应状态的备忘录,但不能对备忘录进行操作

使用场景

  • 需要实现撤销、恢复操作的场景(例如编辑器软件撤销功能)
  • 需要保存、恢复数据的相关状态场景(文件、游戏存档等)
  • 需要做一些回滚操作时(路由回退、浏览器历史记录等)

优点

  • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  • 实现信息的封装,用户不需要关心状态的保存细节

缺点

  • 消耗资源 - 如果类的成员变量过多,会占用比较大的资源,而且每一次保存都会消耗一定的内存
  • 若遇到数据量大时可能还会影响程序性能下降,因为备忘录每次保存都是在消耗内存

代码实现

/** JavaScript 备忘录模式案例写法
 * 在这个例子中,定义了三个类:备忘录类、发起人类和管理者类。发起人类用来创建和恢复备忘录,管理者类用来管理备忘录的集合。
 * 我们将发起人类的状态保存到备忘录中,并将备忘录存储到管理者类中,以便以后可以恢复到之前的某个状态。
 * 当需要撤销操作时,我们可以从管理者类中获取之前保存的备忘录,并将其恢复到发起人类中。这样,发起人类就可以回到之前的状态了。
 */

/** 备忘录类
 *  提供给发起人创建一个保存当前对象状态的备忘录
 *  同时提供getState用于后面恢复都某个状态
 */
class Memento {
  constructor(state) {
    this.state = state;
  }
  getState() {
    return this.state;
  }
}

/** 发起人类
 * setState 设置当前状态
 * getState 获取当前状态
 * saveStateToMemento 将当前状态创建一个备忘录,同时保存到管理者
 * getStateFromMemento 发起人从管理者中恢复某个备忘录
 */
class Originator {
  constructor() {
    this.state = '';
  }
  setState(state) {
    this.state = state;
  }
  getState() {
    return this.state;
  }
  saveStateToMemento() {
    return new Memento(this.state);
  }
  getStateFromMemento(memento) {
    this.state = memento.getState();
  }
}

/** 管理者类
 * mementos 通过一个 list 保存发起人创建的备忘录
 * addMemento 添加备忘录方法
 * getMemento 恢复某个备忘录状态(为了演示就直接使用的是索引的方式)
 */
class CareTaker {
  constructor() {
    this.mementos = [];
  }
  addMemento(memento) {
    this.mementos.push(memento);
  }
  getMemento(index) {
    return this.mementos[index];
  }
}

// 使用示例
const originator = new Originator();
const careTaker = new CareTaker();

// 第一次保存状态
originator.setState('第一次的状态');
// 同时调用发起人里面的 saveStateToMemento 方法,向管理者添加一条备忘录,以便后面某个时刻可以恢复这个状态
careTaker.addMemento(originator.saveStateToMemento());

// 第二次保存状态
originator.setState('第二次的状态');
// 同上
careTaker.addMemento(originator.saveStateToMemento());

// 恢复到第一次保存的状态,指定索引 0 => 即恢复到第一次保存的状态
originator.getStateFromMemento(careTaker.getMemento(0));

// 正常打印输出 “第一次的状态”
console.log(originator.getState());

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值