代码编织梦想

备忘录模式(Memento Pattern),也叫快照(Snapshot)模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态;这样以后就可将该对象恢复到原先保存的状态。主要是用来防丢失、撤销、恢复等

备忘录模式跟原型模式很像,不过在原型模式中保存对象的一切,而备忘录模式中只保存恢复时需要的数据。

应用场景

备忘录模式跟备份非常相似,只不过是从不同的角度出发和理解,备忘录模式更侧重于代码的设计和实现,备份更侧重架构设计或产品设计。

在很多地方都能看到这种思想的应用:

  • 游戏的自动存档,失败时从存储点继续,不用重新开始。
  • 数据库的全量备份和增量备份,备份时从全量备份点开始即可。
  • 电脑操作的撤销功能Ctrl + Z
  • 数据库的事务管理,用于事务回退。

备忘录模式的构成

  1. Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。

  2. Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。

  3. Caretaker(管理者):负责存储备忘录Memento,不能对Memento的内容进行访问或者操作。

通过一个游戏存档的例子来说明。
玩家发起存档。(发起人)
游戏中,可以设置多个存档。(备忘录)
想恢复到哪个存档点,选择该存档点,进行读取即可。(管理者)

Originator(发起人)

class Player:
    def __init__(self):
        """玩家当前的状态,默认在1,1"""
        self.level = 1
        self.role = 1
    
    # 进度更新时,同步设置玩家内部状态
    def set_player_state(self, level, role):
        self.level = level
        self.role = role

    # 发起存档请求
    def create_archive(self):
        return Archive(self.level, self.role)

    # 恢复到某个存档
    def restore_archive(self, archive: Archive):
        self.level, self.role = archive.get_state()

    # 获取当前进度
    def state(self):
        print(f"玩家当前进度:关卡位置 -> {self.level};玩家等级 -> {self.role};")

在上面我们为发起人类 Player 设置了两个属性,关卡位置 & 玩家等级。

Memento(备忘录)

class Archive:
    """
    备忘录角色,只用来存储存档(保证封装原则),不能修改存档
    """

    def __init__(self, level, role):
        self.level = level  # 关卡信息
        self.role = role  # 角色信息

    # 获取存档信息
    def get_state(self):
        return self.level, self.role

一个备忘录就是一个存档记录,用来保存与进度相关的信息,用来支持玩家备份和恢复进度。

Caretaker(管理者)

class Creator:
    """
    管理者角色
    负责存储所有的存档,不能对存档的内容进行操作和访问,只能够将存档传递
    """

    def __init__(self):
        self.archive_list = list()

    # 添加一个存档
    def add_archive(self, archive: Archive):
        return self.archive_list.append(archive)

    # 获取某个存档记录
    def get_archive(self, index):
        return self.archive_list[index]

管理者通过 archive_list 列表存储了所有的存档,玩家可根据需要获取特定的存档,管理者不可操作存档,只用于保存所有的存档。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tlqwanttolearnit/article/details/129620392

备忘录模式及其实现场景-爱代码爱编程

备忘录模式(Memento Design Pattern),也叫快照(Snapshot)模式。指在不违背封装原则前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。 备忘录模式在日常中很常见,比如Word中的回退,MySQL中的undo log日志,Git版本管理等等,我们都可以从当前状态退回之前保存的状态。比如Gi

此“备忘录”和彼备忘录一样吗?_秦 羽的博客-爱代码爱编程

学习设计模式,让你提升百倍 专栏重点文章设计模式设计模式基础前奏(上)设计模式设计模式基础前奏(下)设计模式创建者模式之单例模式设计模式创建者模式之工厂模式设计模式创建者模式之原型模式设计模式创建者模式之建造者模式设计模

【设计模式】备忘录模式和迭代器模式-爱代码爱编程

备忘录模式和迭代器模式 备忘录模式代码示例 迭代器模式代码示例使用迭代器遍历集合的同时不能删除/增加元素总结 备忘录模式 备忘录模式,也叫快照(Snapshot)模式。 在 GoF的《设计模式》⼀书中

设计模式-第16章(组合模式)-爱代码爱编程

组合模式 组合模式公司管理系统组合模式好处 组合模式 组合模式(Composite),将对象组合成树形结构以表示’部分-整体‘的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 Compon

设计模式(二十三)----行为型模式之中介者模式-爱代码爱编程

1 概述 一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有六个同事类对象,假如对象1发生变化,那么将会有4个对象受到影响。如果对象2发生变化,那么将会有5个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。 如果引入中介

23种设计模式——备忘录模式-爱代码爱编程

目录 备忘录模式(Memento) UML图 示例代码 适用场景 优缺点 备忘录模式和原型模式 例子——游戏进度存档 例子——象棋中的悔棋 备忘录模式(Memento) 本质:保存和恢复内部状态 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后就可以利用保存的状态实施恢复。

java设计模式-爱代码爱编程

备忘录模式详解 备忘录模式又叫作快照模式或Token模式,是一种对象的行为模式。在备忘录模式里,一个备忘录是一个对象,它存储另一个对象(原发器对象)在某个瞬间的内部状态。备忘的目的就是为了以后在需要的时候,可以将原发器对象

java设计模式——备忘录模式_java 备忘录模式-爱代码爱编程

Java设计模式——备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态。 传统方案

设计模式-爱代码爱编程

目录 简介 1. 模式动机 2. 深克隆和浅克隆 3. 适用场景 实现 优缺点 原型模式(Prototype Pattern) 是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模

【设计模式之美 设计原则与思想:设计原则】26 | 实战二(下):如何实现一个支持各种统计规则的性能计数器?_运用设计模式的计数器-爱代码爱编程

在上一节课中,我们对计数器框架做了需求分析和粗略的模块划分。今天这节课,我们利用面向对象设计、实现方法,并结合之前学过的设计思想、设计原则来看一下,如何编写灵活、可扩展的、高质量的代码实现。 话不多说,现在就让我们正式开始