设计模式: 行为型之备忘录模式(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 ) 缺点

  • 如果发起人状态很大或者很多,那么存储起来可能会消耗很大的内存
  • 可能会存在很多备忘录对象,消耗内存
  • 在实际应用中,备忘录模式通常用于实现诸如"撤销"这样的功能,例如文本编辑器中的撤销操作
  • 通过保存用户每次编辑操作的状态,可以方便地撤销到之前的状态
相关推荐
小白不太白9505 小时前
设计模式之 模板方法模式
java·设计模式·模板方法模式
色空大师6 小时前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)6 小时前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
博风7 小时前
设计模式:6、装饰模式(包装器)
设计模式
A_cot7 小时前
理解设计模式与 UML 类图:构建稳健软件架构的基石
microsoft·设计模式·简单工厂模式·工厂方法模式·uml
君败红颜7 小时前
设计模式之创建模式篇
设计模式
闲人一枚(学习中)10 小时前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
小白不太白95012 小时前
设计模式之 观察者模式
观察者模式·设计模式
小白不太白95013 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in14 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式