备忘录模式(Memento Pattern)

简介: 备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到原先保存的状态。

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到原先保存的状态。

在备忘录模式中,有三个核心角色:Originator(原发器)、Memento(备忘录)和Caretaker(负责人)。Originator(原发器)是需要被保存状态的对象,Memento(备忘录)是保存状态的对象,Caretaker(负责人)用于管理备忘录。

下面是一个简单的备忘录模式Demo,假设有一个文本编辑器,它支持编辑、保存和回滚操作:

```js
# 备忘录类
class EditorMemento:
    def __init__(self, content):
        self._content = content

    def get_content(self):
        return self._content

# 原发器类
class Editor:
    def __init__(self):
        self._content = ""

    def add_content(self, content):
        self._content += content

    def get_content(self):
        return self._content

    def save(self):
        return EditorMemento(self._content)

    def restore(self, memento):
        self._content = memento.get_content()

# 负责人类
class History:
    def __init__(self):
        self._mementos = []

    def add_memento(self, memento):
        self._mementos.append(memento)

    def get_memento(self, index):
        return self._mementos[index]

# 客户端代码
editor = Editor()
history = History()

editor.add_content("Hello")
editor.add_content("World")

history.add_memento(editor.save())

editor.add_content("!")

print(editor.get_content()) # 输出:HelloWorld!

editor.restore(history.get_memento(0))

print(editor.get_content()) # 输出:HelloWorld

在这个Demo中,Editor是原发器类,它维护了一个文本内容(需要被保存的状态),并实现了添加内容、获取内容、保存状态和恢复状态的方法。EditorMemento是备忘录类,它保存了Editor的状态。History是负责人类,它维护了一组备忘录对象,并实现了添加备忘录和获取备忘录的方法。

当客户端使用备忘录模式时,需要先定义一个原发器类、备忘录类和负责人类。原发器类维护了需要被保存的状态,并实现了保存状态和恢复状态的方法。备忘录类保存了原发器的状态。负责人类维护了一组备忘录对象,并实现了添加备忘录和获取备忘录的方法。

备忘录模式的应用场景比较广泛,例如:

1. 撤销和恢复操作:用户可以使用备忘录模式来实现撤销和恢复操作,即保存每个操作之前的状态,并在需要恢复时重新加载状态。
2. 游戏进度存储:游戏可以使用备忘录模式来保存玩家的进度状态,以便在下次进入游戏时可以恢复到上一次保存的状态。
3. 编辑器自动保存:编辑器可以使用备忘录模式来自动保存文件的状态,以便在发生异常或意外关闭时可以恢复到上一次保存的状态。

补充一下,这个示例是Python代码,下面是一个相似的Java代码示例:

```java
import java.util.*;

// 备忘录类
class EditorMemento {
    private final String content;

    public EditorMemento(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }
}

// 原发器类
class Editor {
    private String content = "";

    public void addContent(String content) {
        this.content += content;
    }

    public String getContent() {
        return content;
    }

    public EditorMemento save() {
        return new EditorMemento(content);
    }

    public void restore(EditorMemento memento) {
        this.content = memento.getContent();
    }
}

// 负责人类
class History {
    private final List<EditorMemento> mementos = new ArrayList<>();

    public void addMemento(EditorMemento memento) {
        mementos.add(memento);
    }

    public EditorMemento getMemento(int index) {
        return mementos.get(index);
    }
}

// 客户端代码
Editor editor = new Editor();
History history = new History();

editor.addContent("Hello");
editor.addContent("World");

history.addMemento(editor.save());

editor.addContent("!");

System.out.println(editor.getContent()); // 输出:HelloWorld!

editor.restore(history.getMemento(0));

System.out.println(editor.getContent()); // 输出:HelloWorld

以下是一些推荐的学习资料和链接,可以帮助你更好地学习备忘录模式:

《Head First 设计模式》:这是一本非常通俗易懂的设计模式入门书籍,其中包含了对备忘录模式的讲解和示例代码。
《设计模式:可复用面向对象软件的基础》:这是设计模式的经典著作之一,其中包含了对备忘录模式的详细讲解和示例代码。
《图解设计模式:以UML为基础,学习23种设计模式》:这是一本以图解为主的设计模式入门书籍,其中包含了对备忘录模式的详细讲解和示例代码。
备忘录模式的Java实现:这是一个包含了备忘录模式示例代码的Java项目,可以帮助读者更好地理解和应用备忘录模式。
GitHub链接:https://github.com/iluwatar/java-design-patterns/tree/master/memento
总之,学习备忘录模式需要结合书籍和实践,建议读者选择一些适合自己的入门书籍,同时结合实际项目中的设计问题进行实践,加深对备忘录模式的理解和应用。

目录
相关文章
|
SQL 缓存 监控
带你读《Apache Doris 案例集》——03 Apache Doris 在金融壹账通指标中台的应用实践(2)
带你读《Apache Doris 案例集》——03 Apache Doris 在金融壹账通指标中台的应用实践(2)
391 1
带你读《Apache Doris 案例集》——03  Apache   Doris  在金融壹账通指标中台的应用实践(2)
|
7月前
|
物联网 异构计算
高效部署通义万相Wan2.1:使用Gradio搭建WebUI体验实战
随着通义万相Wan2.1 在社区的热度持续上涨,魔搭创空间的体验Demo(https://modelscope.cn/studios/Wan-AI/Wan-2.1)已经排起长队。
1554 12
使用 sync.Cond 来协调并发 goroutine 的访问共享资源
使用 sync.Cond 来协调并发 goroutine 的访问共享资源
|
安全 Android开发 iOS开发
移动应用开发之旅:从新手到专家的蜕变之路
【9月更文挑战第14天】本文将带你踏上一段探索移动应用开发的旅程,从基础概念的理解到高级技术的掌握,我们将一起见证一个初学者如何逐步成长为一名熟练的开发者。在这个过程中,我们将深入探讨移动操作系统的核心知识,学习如何在多个平台上构建高效的应用程序,并掌握性能优化、安全性增强和用户体验设计的关键策略。通过实际案例分析,你将获得宝贵的经验,学会如何应对常见的开发挑战。无论你是刚刚起步,还是希望提升现有技能,这篇文章都将为你提供一条清晰的道路,帮助你在移动应用开发领域取得突破。
|
移动开发 前端开发
ruoyi-nbcio-plus基于vue3的flowable脚本任务的升级修改
ruoyi-nbcio-plus基于vue3的flowable脚本任务的升级修改
106 0
|
SQL 关系型数据库 MySQL
mysql异常java.math.BigInteger cannot be cast to java.lang.Long
mysql异常java.math.BigInteger cannot be cast to java.lang.Long
271 0
|
机器学习/深度学习 存储 传感器
「人工智能」没有数据智能的人工智能是人工的
「人工智能」没有数据智能的人工智能是人工的
|
Java 应用服务中间件 调度
线程与进程、并行与并发
详解线程与进程、并行与并发
215 0
线程与进程、并行与并发
|
XML Kubernetes Dubbo
dubbo应用级服务发现初体验
了解dubbo的朋友知道,dubbo的provider启动时向注册中心注册,consumer从注册中心消费。 目前dubbo往注册中心上注册的数据是接口级,而应用级服务发现是往注册中心上注册实例(ip+port),两者的区别只是注册的粒度不同。
280 0
dubbo应用级服务发现初体验