备忘录模式(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
总之,学习备忘录模式需要结合书籍和实践,建议读者选择一些适合自己的入门书籍,同时结合实际项目中的设计问题进行实践,加深对备忘录模式的理解和应用。

目录
相关文章
|
设计模式 Java uml
中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern)是一种行为型设计模式,它用于降低多个对象之间的耦合度,通过引入一个中介者对象,将对象之间的交互转化为中介者和对象之间的交互,从而避免了对象之间的直接耦合。
95 1
|
存储 Java 程序员
行为型模式 - 备忘录模式(Memento Pattern)
行为型模式 - 备忘录模式(Memento Pattern)
你又是怎么理解「Memento Pattern」的呢
你又是怎么理解「Memento Pattern」的呢
60 0
|
Java 程序员
行为型模式 - 观察者模式(Observer Pattern)
行为型模式 - 观察者模式(Observer Pattern)
|
算法 Java 编译器
行为型模式 - 访问者模式(Visitor Pattern)
行为型模式 - 访问者模式(Visitor Pattern)
|
设计模式 存储 小程序
行为型-Memento
备忘录模式的原理与实现 备忘录模式,也叫快照(Snapshot)模式,英文翻译是 Memento Design Pattern。在 GoF 的《设计模式》一书中,备忘录模式是这么定义的: Captures and externalizes an object’s internal state so that it can be restored later, all without violating encapsulation. 翻译成中文就是:在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。
107 0
|
存储 C# 数据库
C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】
原文:C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】 一、引言   今天我们开始讲“行为型”设计模式的第十个模式,该模式是【备忘录模式】,英文名称是:Memento Pattern。
1098 0
|
C# 数据库 存储
C#设计模式(23)——备忘录模式(Memento Pattern)
原文:C#设计模式(23)——备忘录模式(Memento Pattern) 一、引言    在上一篇博文分享了访问者模式,访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离。
1273 0