设计模式-备忘录模式

简介

备忘录模式是一种行为设计模式,允许捕获和存储一个对象的当前状态,并在以后将其恢复到这个状态。这种模式在功能如撤销机制或者保存和加载游戏状态的场景中非常有用。

主要组成

备忘录模式通常涉及以下三个主要角色:

  • 发起人(Originator):
    • 负责创建一个备忘录,用以记录其当前内部状态。
    • 可以使用备忘录恢复其内部状态。
  • 备忘录(Memento):
    • 存储发起人对象的内部状态。
    • 防止发起人以外的其他对象访问备忘录。
  • 看护者(Caretaker):
    • 负责保存备忘录。
    • 不修改备忘录,也不直接操作备忘录的数据。

工作流程

  • 保存状态: 发起人生成一个含有其当前内部状态的备忘录对象,并将此备忘录对象传递给看护者。看护者随后将这个备忘录对象保存在存储中,但不会修改它或直接访问其内容。
  • 恢复状态: 当需要将发起人对象恢复到之前保存的状态时,看护者将之前存储的备忘录对象返回给发起人。发起人使用备忘录对象中的状态进行自身状态的恢复。

示例实现

假设我们有一个简单的游戏角色,可以保存和恢复其状态。

javascript 复制代码
// 发起人
class GameCharacter {
    constructor(health, magic) {
        this.health = health;
        this.magic = magic;
    }

    save() {
        return new Memento(this.health, this.magic);
    }

    restore(memento) {
        this.health = memento.health;
        this.magic = memento.magic;
    }

    displayStats() {
        console.log(`Health: ${this.health}, Magic: ${this.magic}`);
    }
}

// 备忘录
class Memento {
    constructor(health, magic) {
        this.health = health;
        this.magic = magic;
    }
}

// 看护者
class Caretaker {
    constructor() {
        this.mementos = [];
    }

    addMemento(memento) {
        this.mementos.push(memento);
    }

    getMemento(index) {
        return this.mementos[index];
    }
}

// 使用示例
const character = new GameCharacter(100, 75);
character.displayStats(); // Health: 100, Magic: 75

const caretaker = new Caretaker();
caretaker.addMemento(character.save()); // 保存当前状态

// 状态改变
character.health = 50;
character.magic = 20;
character.displayStats(); // Health: 50, Magic: 20

// 恢复之前的状态
character.restore(caretaker.getMemento(0));
character.displayStats(); // Health: 100, Magic: 75

优点和适用场景

  • 优点:

    • 提供了一种恢复状态的机制,而不暴露对象的实现细节。
    • 可以简化发起人类的责任,它只需要在备忘录中保存一份自己的副本。
  • 适用场景:

    • 当你需要记录对象的内部状态,以便稍后可能恢复到这个状态时。
    • 当直接接口获取状态会暴露实现细节,并破坏对象的封装性时。

总结

备忘录模式为状态的保存和恢复提供了一种优雅的解决方案,使得不会破坏原始类的封装性和责任分明。

相关推荐
晨米酱10 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机15 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机16 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤16 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式