当前位置:首页 > 文章列表 > 文章 > 前端 > 备忘录模式是什么?怎么使用备忘录

备忘录模式是什么?怎么使用备忘录

2025-09-27 20:07:36 0浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个文章开发实战,手把手教大家学习《备忘录模式是什么?如何应用备忘录》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

备忘录模式通过发起人、备忘录和负责人三者协作,实现对象状态的保存与恢复;发起人创建并恢复状态,备忘录存储状态且对外透明,负责人管理备忘录而不访问其内容,从而在不破坏封装性的前提下支持撤销、重做、游戏存档等场景。

什么是备忘录模式?备忘录的应用

备忘录模式,简单来说,就是一种在不破坏对象封装性的前提下,捕获并保存一个对象的内部状态,以便将来可以恢复到该状态的设计模式。它把对象的某个时刻的状态保存下来,就像拍了张快照。这听起来可能有点抽象,但想象一下你在玩游戏,随时可以存档、读档;或者在写文档,可以无限次地撤销、重做——这些功能背后,很可能就有备忘录模式的影子。它核心的价值在于,让我们能在需要的时候,把一个复杂对象“冻结”在某个特定状态,后续还能“解冻”回去,而这个过程对外部来说是透明的,不会暴露对象内部的实现细节。

备忘录模式的核心在于解耦:它将状态的保存和恢复逻辑从需要保存状态的对象(发起人 Originator)中分离出来,交给一个独立的备忘录对象(Memento)来承载。同时,还有一个负责人(Caretaker)来管理这些备忘录。

发起人(Originator)是那个拥有内部状态的对象,它知道如何创建自己的备忘录(即保存当前状态),也知道如何从备忘录中恢复状态。它就像一个艺术家,能够把自己的创作过程中的某个阶段“拍下来”,并能在需要时根据这张“照片”还原。

备忘录(Memento)则是一个纯粹的容器,用来存储发起人对象的内部状态。它通常对外提供一个窄接口,让负责人无法直接访问其内部细节,从而保护了发起人的封装性。对发起人而言,备忘录是透明的,可以访问其所有状态;但对负责人来说,备忘录就是个“黑盒子”,只能存储和传递,不能窥探。这种设计很巧妙,它确保了只有发起人自己能理解并操作自己的“快照”。

负责人(Caretaker)负责存储和管理备忘录对象。它从发起人那里获取备忘录,并在需要时将其还给发起人。负责人完全不知道备忘录内部到底存了些什么,它只管“存”和“取”,就像一个图书馆管理员,只负责图书的借阅和归还,而无需关心书本里的具体内容。

这种三角色协作的模式,完美地实现了状态保存与恢复的逻辑与业务逻辑的分离。我个人觉得,它最棒的地方就在于,它允许你在不污染原有业务逻辑代码的前提下,为对象增加“时间旅行”的能力。

备忘录模式解决的核心问题是什么?

我们为什么会需要备忘录模式?在我看来,它主要解决了一个非常实际且常见的痛点:如何在不打破对象封装性的前提下,保存并恢复其内部状态。设想一下,你有一个非常复杂的对象,比如一个图形编辑器中的画布对象,它包含了所有图层、图形、颜色、位置等信息。现在你需要实现“撤销”功能。

如果直接去访问画布对象的内部成员来保存状态,那无疑会打破它的封装性。一旦内部结构发生变化,所有依赖这些内部细节的保存/恢复代码都得跟着改,这简直是噩梦。而且,你可能需要保存很多个历史状态,手动管理这些状态的复杂性会迅速失控。

传统上,我们可能会想到深拷贝或者序列化。深拷贝固然能复制状态,但如果对象图很复杂,循环引用、资源管理等问题会让你头疼不已。序列化虽然可以将对象状态持久化,但它通常是为了跨进程或长期存储,对于内存中的频繁状态切换(比如撤销/重做)来说,性能开销可能过大,而且同样可能暴露内部结构。

备忘录模式的优雅之处在于,它把“如何保存状态”的细节封装在了发起人内部。发起人自己创建备忘录,自己从备忘录恢复。负责人只拿到一个“不透明”的备忘录对象,它不知道里面存了什么,也无法直接修改。这就像你把一个加密的盒子交给朋友保管,朋友只知道这是一个盒子,里面装了东西,但他打不开,只有你才能打开并取出里面的东西。这种设计完美地维护了对象的封装性,降低了耦合度。它让状态管理变得可控,而且对外部调用者来说,使用起来也极其简洁。

备忘录模式在实际开发中有哪些经典应用场景?

备忘录模式的应用场景其实非常广泛,只要涉及到“回溯”或“快照”功能的,它都是一个值得考虑的方案。

最经典的,无疑是撤销(Undo)和重做(Redo)功能。在任何文本编辑器、图形设计软件、CAD软件中,你进行的每一步操作都可以被撤销。每次操作完成后,软件可以创建一个当前状态的备忘录,并将其压入一个历史栈中。当用户点击“撤销”时,就从栈顶取出一个备忘录,恢复到上一个状态。这简直是备忘录模式的教科书式应用。

其次,游戏存档和进度保存也是备忘录模式的绝佳舞台。玩家在游戏中达到某个关键点,可以保存当前游戏状态,包括角色位置、物品、任务进度、敌人状态等等。这些复杂的内部状态被打包成一个或多个备忘录,然后可以序列化到文件或数据库中。下次玩家加载游戏时,就是从这些备忘录中恢复游戏世界。

在某些事务管理的场景中,备忘录模式也能发挥作用。比如,你可能需要执行一系列操作,但这些操作可能失败,或者需要提供回滚机制。你可以在操作开始前保存系统或关键对象的“快照”,如果操作失败,就利用备忘录恢复到初始状态。虽然数据库事务有其自身的机制,但在应用层处理某些业务逻辑的原子性时,备忘录提供了一种思路。

此外,在A/B测试或配置管理中,有时也需要保存和恢复不同的配置状态。比如,一个复杂的系统有多种运行配置,你可以在运行时切换到某个配置,然后又快速切换回另一个配置。每种配置都可以被视为一个备忘录。

如何实现一个简单的备忘录模式?

我们以一个简单的文本编辑器为例,看看如何用代码实现备忘录模式。这里用Python风格的伪代码来展示,因为它足够简洁明了。

# 1. 备忘录 (Memento)
class EditorMemento:
    def __init__(self, content):
        self._content = content

    def get_saved_content(self):
        return self._content

# 2. 发起人 (Originator) - 文本编辑器本身
class TextEditor:
    def __init__(self):
        self._content = ""

    def type(self, text):
        self._content += text
        print(f"当前内容: {self._content}")

    def save(self):
        # 创建一个备忘录,保存当前内容
        print("保存当前内容...")
        return EditorMemento(self._content)

    def restore(self, memento):
        # 从备忘录中恢复内容
        self._content = memento.get_saved_content()
        print(f"内容已恢复为: {self._content}")

# 3. 负责人 (Caretaker) - 历史管理器
class HistoryManager:
    def __init__(self):
        self._history = [] # 存储备忘录的列表

    def add_memento(self, memento):
        self._history.append(memento)
        print("备忘录已添加到历史记录。")

    def get_last_memento(self):
        if not self._history:
            return None
        # 取出并移除最后一个备忘录(模拟撤销)
        return self._history.pop()

# 客户端代码
if __name__ == "__main__":
    editor = TextEditor()
    history = HistoryManager()

    # 1. 初始状态
    editor.type("Hello, ")
    history.add_memento(editor.save()) # 保存状态1

    # 2. 修改状态
    editor.type("world!")
    history.add_memento(editor.save()) # 保存状态2

    # 3. 继续修改
    editor.type(" How are you?")

    # 4. 撤销一次
    print("\n执行撤销操作...")
    last_memento = history.get_last_memento()
    if last_memento:
        editor.restore(last_memento)
    else:
        print("没有可撤销的历史记录了。")

    # 5. 再撤销一次
    print("\n再次执行撤销操作...")
    last_memento = history.get_last_memento()
    if last_memento:
        editor.restore(last_memento)
    else:
        print("没有可撤销的历史记录了。")

    # 6. 尝试再次撤销(此时没有历史了)
    print("\n尝试再次撤销操作...")
    last_memento = history.get_last_memento()
    if last_memento:
        editor.restore(last_memento)
    else:
        print("没有可撤销的历史记录了。")

在这个例子中:

  • EditorMemento 是备忘录,它简单地封装了文本内容。
  • TextEditor 是发起人,它有 _content 状态,并提供了 save() 来创建备忘录,restore() 来从备忘录恢复。
  • HistoryManager 是负责人,它维护一个备忘录列表,负责添加和获取备忘录。它完全不关心备忘录内部是什么,只知道这是一个可以存储和取出的对象。

通过这种方式,HistoryManager 可以管理 TextEditor 的多个历史状态,而无需知道 TextEditor 内部是如何存储文本的,完美地实现了封装和解耦。这就是备忘录模式的魅力所在。

理论要掌握,实操不能落!以上关于《备忘录模式是什么?怎么使用备忘录》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

Win11右键刷新慢怎么优化Win11右键刷新慢怎么优化
上一篇
Win11右键刷新慢怎么优化
JavaScript装饰器如何增强代码功能?
下一篇
JavaScript装饰器如何增强代码功能?
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    499次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • AI 试衣:潮际好麦,电商营销素材一键生成
    潮际好麦-AI试衣
    潮际好麦 AI 试衣平台,助力电商营销、设计领域,提供静态试衣图、动态试衣视频等全方位服务,高效打造高质量商品展示素材。
    29次使用
  • 蝉妈妈AI:国内首个电商垂直大模型,抖音增长智能助手
    蝉妈妈AI
    蝉妈妈AI是国内首个聚焦电商领域的垂直大模型应用,深度融合独家电商数据库与DeepSeek-R1大模型。作为电商人专属智能助手,它重构电商运营全链路,助力抖音等内容电商商家实现数据分析、策略生成、内容创作与效果优化,平均提升GMV 230%,是您降本增效、抢占增长先机的关键。
    77次使用
  • 社媒分析AI:数说Social Research,用AI读懂社媒,驱动增长
    数说Social Research-社媒分析AI Agent
    数说Social Research是数说故事旗下社媒智能研究平台,依托AI Social Power,提供全域社媒数据采集、垂直大模型分析及行业场景化应用,助力品牌实现“数据-洞察-决策”全链路支持。
    88次使用
  • 先见AI:企业级商业智能平台,数据驱动科学决策
    先见AI
    先见AI,北京先智先行旗下企业级商业智能平台,依托先知大模型,构建全链路智能分析体系,助力政企客户实现数据驱动的科学决策。
    89次使用
  • 职优简历:AI驱动的免费在线简历制作平台,提升求职成功率
    职优简历
    职优简历是一款AI辅助的在线简历制作平台,聚焦求职场景,提供免费、易用、专业的简历制作服务。通过Markdown技术和AI功能,帮助求职者高效制作专业简历,提升求职竞争力。支持多格式导出,满足不同场景需求。
    83次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码