设计模式: 行为型之备忘录模式(13)

备忘录模式概述

  • 备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态
  • 这样以后就可将该对象恢复到原先保存的状态。这种类型的设计模式属于行为模式
  • 在备忘录模式中,主要涉及三种角色:
    • 发起人 (Originator)角色
      • 记录当前时刻它的内部状态,并可使用备忘录恢复内部状态
      • 发起人可以根据需要决定备忘录存储发起人的哪些状态
    • 备忘录 (Memento)角色
      • 负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录
      • 备忘录有两个接口,一是提供它所能保存的发起人内部状态,二是将这些状态恢复到发起人对象中
    • 管理者 (Caretaker)角色
      • 负责保存好备忘录,不能对备忘录的内容进行操作或检查

备忘录模式应用

ts 复制代码
// 原始类(Originator)定义
class Originator {
  private state: string; // 内部状态

  constructor(state: string) {
    this.state = state;
  }

  // 创建备忘录方法,返回备忘录对象
  createMemento(): Memento {
    return new Memento(this.state);
  }

  // 设置内部状态方法,可以通过备忘录恢复状态
  setMemento(memento: Memento) {
    this.state = memento.getState();
  }

  // 其他业务逻辑,改变内部状态
  setState(newState: string) {
    this.state = newState;
    console.log(`State changed to: ${this.state}`);
  }

  // 获取当前状态
  getState(): string {
    return this.state;
  }
}

// 备忘录接口和实现
interface Memento {
  getState(): string;
}

class ConcreteMemento implements Memento {
  private _state: string;

  constructor(state: string) {
    this._state = state;
  }

  getState(): string {
    return this._state;
  }
}

// 管理者角色(Caretaker)负责保管备忘录,但不关心备忘录的具体内容
class Caretaker {
  private _mementos: Memento[] = [];

  // 添加备忘录
  addMemento(memento: Memento) {
    this._mementos.push(memento);
  }

  // 获取备忘录,通常由原始类调用
  getMemento(index: number): Memento | undefined {
    return this._mementos[index];
  }
}

// 示例用法
const originator = new Originator("Initial State");
console.log("Original state:", originator.getState());

// 创建一个备忘录并保存状态
const caretaker = new Caretaker();
caretaker.addMemento(originator.createMemento());

// 改变原始类的状态
originator.setState("New State");
console.log("Changed state:", originator.getState());

// 通过备忘录恢复状态
if (caretaker.getMemento(0)) {
  originator.setMemento(caretaker.getMemento(0)!);
  console.log("Restored state:", originator.getState());
}
  • 在这个例子中:Originator 类代表了一个包含内部状态的对象,它定义了如何创建 (createMemento) 和恢复 (setMemento) 备忘录。
  • Memento 是一个接口,代表备忘录对象,它包含了对内部状态的引用,但对外部世界隐藏了这些状态的具体内容。ConcreteMemento 类实现了这个接口,存储了实际的状态值。
  • Caretaker 类扮演管理者角色,它可以接收备忘录并存储它们,但它并不知道如何解读备忘录的内容。当需要时,它把备忘录交还给 Originator 进行状态恢复。
  • 通过这种模式,我们可以安全地保存和恢复 Originator 的内部状态,同时保持了良好的封装性

备忘录模式的优缺点

1 )优点

  • 它提供了一种可以撤销操作的机制
  • 封装了内部状态,并通过对外部提供的接口来恢复内部状态

2 ) 缺点

  • 如果发起人状态很大或者很多,那么存储起来可能会消耗很大的内存
  • 可能会存在很多备忘录对象,消耗内存
  • 在实际应用中,备忘录模式通常用于实现诸如"撤销"这样的功能,例如文本编辑器中的撤销操作
  • 通过保存用户每次编辑操作的状态,可以方便地撤销到之前的状态
相关推荐
Larcher18 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
咖啡八杯2 天前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
:mnong2 天前
学习创建结构行为设计模式
设计模式
w_t_y_y2 天前
Agent设计模式(四)多模态融合模式(Multi-Modal Fusion)
设计模式
zhouhui0012 天前
订单状态的 if-else 地狱上线就崩——状态模式的工业级落地
设计模式
geovindu2 天前
go: Reactor Pattern
开发语言·后端·设计模式·golang·反应器模式
一只旭宝3 天前
【C++入门精讲22】常见设计模式
c++·设计模式
许彰午3 天前
38_Java设计模式之装饰器模式
java·设计模式·装饰器模式
geovindu3 天前
python: Reactor Pattern
开发语言·python·设计模式·反应器模式