TypeScript 设计模式之【备忘录模式】

在这里插入图片描述

备忘录模式:时光机器的魔法

想象一下,如果你能拥有一台时光机器,可以随时回到过去的某个时,那该有多么神奇?在软件开发中,我们经常需要保存对象的历史状态,以便在需要时恢复。备忘录模式就像这台时光机器,它允许我们捕获对象的内部状态,并在之后将对象恢复到这个状态。

在复杂的应用程序中,我们经常需要实现撤销、回滚或者保存历史记录的功能。备忘录模式提供了一种优雅的方式来实现这些功能,而不会破坏对象的封装性,让我们一起探索这个神奇的"时光机器"吧!

备忘录模式的奥秘

备忘录模式就像一个"状态快照系统",它提供了一种方法,可以在不破坏封装的前提下捕获一个对象的内部状态,并在之后将对象恢复到这个状态。通过这个状态快照系统,你可以轻松实现撤销、恢复等功能,使得系统更加灵活和强大。

备忘录模式有什么利与弊?

备忘录模式的优点是可以保存和恢复对象的状态,而不破坏封装性。它遵循单一职责原则,将状态管理的责任从原发器对象中分离出来。缺点是会消耗大量的内存,特别是在需要存储大量历史状态的情况下。

如何使用备忘录模式来优化你的系统

备忘录涉及角色

  • 发起人(Originator): 创建并在需要时使用备忘录来恢复自身状态
  • 备忘录(Memento): 存储发起人对象的内部状态
  • 管理者(Caretaker): 负责保存备忘录,但不能操作或检查备忘录的内容

备忘录步骤

  1. 创建发起人类,包含需要保存的状态
  2. 创建备忘录类,用于存储发起人的状态
  3. 在发起人类中实现创建备忘录和从备忘录恢复状态的方法
  4. 创建管理者类,负责存储和管理备忘录对象
  5. 在客户端代码中使用管理者来保存和恢复发起人的状态

选择合适的备忘录模式,你就能轻松地实现状态的保存和恢复,让系统变得更加灵活和强大!

代码实现案例

// 备忘录类
class Memento {
  private state: string;
  constructor(state: string) {
    this.state = state;
  }
  // 获取状态
  getState(): string {
    return this.state;
  }
}

// 文本编辑器
class TextEditor {
  private content: string = "";
  // 设置内容
  setContent(content: string): void {
    this.content = content;
  }
  // 获取内容
  getContent(): string {
    return this.content;
  }
  // 创建备忘录
  createMemento(): Memento {
    return new Memento(this.content);
  }
  // 从备忘录恢复状态
  restoreFromMemento(memento: Memento): void {
    this.content = memento.getState();
  }
}

// 历史管理者类
class History {
  private mementos: Memento[] = [];
  // 添加备忘录
  addMemento(memento: Memento): void {
    this.mementos.push(memento);
  }
    
  getMemento(index: number): Memento {
    return this.mementos[index];
  }
}

// 客户端代码
const editor = new TextEditor();
const history = new History();

editor.setContent("这是第一行文本。");
history.addMemento(editor.createMemento());

editor.setContent("这是第二行文本。");
history.addMemento(editor.createMemento());

editor.setContent("这是第三行文本。");
console.log("当前内容:", editor.getContent());

// 撤销到第二个状态
editor.restoreFromMemento(history.getMemento(1));
console.log("撤销后内容:", editor.getContent());

// 撤销到第一个状态
editor.restoreFromMemento(history.getMemento(0));
console.log("再次撤销后内容:", editor.getContent());

// 输出
// 当前内容: 这是第三行文本。
// 撤销后内容: 这是第二行文本。
// 再次撤销后内容: 这是第一行文本。

在这里插入图片描述

备忘录模式的主要优点

  1. 封装性好: 备忘录模式可以将对象状态的保存和恢复封装在备忘录对象中,不会破坏原对象的封装性
  2. 提供了状态恢复的机制: 可以方便地实现撤销、回滚等功能
  3. 简化了发起人: 发起人不需要关心状态的保存细节,这些都被转移到了备忘录对象中
  4. 提供了对象状态的快照: 可以在不同的时间点保存对象的状态,便于后续的恢复或比较

备忘录模式的主要缺点

  1. 消耗大量内存: 假如需要保存的状态数量很多,或者状态内容很大,会占用大量的内存
  2. 影响性能: 频繁地创建和恢复状态可能会影响系统的性能
  3. 暴露对象的内部结构: 为了存储和恢复对象的状态,需要暴露一些原本不需要暴露的内部结构

备忘录模式的适用场景

  1. 需要保存和恢复数据的场景: 如撤销、回滚功能
  2. 需要监控对象状态的场景: 如调试时保存对象的历史状态
  3. 需要保存的副本数量不确定的场景: 如保存游戏进度
  4. 希望保持封装性,又需要保存对象状态的场景

总结

备忘录模式是一种行为型设计模式,它通过将对象的状态保存在外部的备忘录对象中,实现对象状态的保存和恢复。备忘录模式通过将状态管理的责任从原对象中分离出来,提高系统的灵活性和可维护性。合理使用备忘录模式,能让你的代码更加健壮,更容易实现复杂的状态管理功能。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告: TypeScript 设计模式之【观察者模式】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bobostudio1995

感谢您的一杯咖啡,是我前进的动

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值