设计模式-备忘录模式

简介

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

主要组成

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

  • 发起人(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

优点和适用场景

  • 优点:

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

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

总结

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

相关推荐
alibli3 小时前
一文学会设计模式之创建型模式及最佳实现
c++·设计模式
1024肥宅4 小时前
前端常用模式:提升代码质量的四大核心模式
前端·javascript·设计模式
郝学胜-神的一滴9 小时前
设计模式依赖于多态特性
java·开发语言·c++·python·程序人生·设计模式·软件工程
帅次9 小时前
系统分析师:软件需求工程的软件需求概述、需求获取、需求分析
设计模式·重构·软件工程·团队开发·软件构建·需求分析·规格说明书
EXtreme359 小时前
【数据结构】算法艺术:如何用两个栈(LIFO)优雅地模拟队列(FIFO)?
c语言·数据结构·算法·设计模式·栈与队列·摊还分析·算法艺术
1024肥宅1 天前
JavaScript常用设计模式完整指南
前端·javascript·设计模式
特立独行的猫a1 天前
C++观察者模式设计及实现:玩转设计模式的发布-订阅机制
c++·观察者模式·设计模式
better_liang1 天前
每日Java面试场景题知识点之-单例模式
java·单例模式·设计模式·面试·企业级开发
sg_knight1 天前
什么是设计模式?为什么 Python 也需要设计模式
开发语言·python·设计模式
koping_wu1 天前
【设计模式】设计模式原则、单例模式、工厂模式、模板模式、策略模式
单例模式·设计模式·策略模式