likes
comments
collection
share

深究设计模式之-备忘录模式

作者站长头像
站长
· 阅读数 4

备忘录模式(Memento Pattern)是一种行为型设计模式,其主要目的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,以便之后可以将对象恢复到原先保存的状态。备忘录,顾名思义主要是记录行为过程中的一个状态的,而记录状态就是为了能恢复到这个状态。所以备忘录模式通常用于需要提供撤销操作的场景。

就像我们在玩游戏时保存进度的功能。当我们想在某个特定点回到游戏中,我们保存当前状态,然后可以随时恢复到那个状态。在软件设计中,备忘录模式帮助我们保存对象的状态,以便在需要时能够还原到之前的状态,而无需暴露对象的内部细节。这对于撤销机制或历史记录等场景非常有用。

主要角色:

  1. 发起人(Originator): 负责创建一个备忘录,并且可以使用备忘录恢复其内部状态。

  2. 备忘录(Memento): 存储发起人的内部状态,包含了需要恢复的信息。

  3. 负责人(Caretaker): 负责保存备忘录,但是不能修改备忘录的内容。

示例:

一个文本编辑器的例子,用户可以输入文本并进行编辑,而备忘录模式可以用于保存编辑历史,以便用户可以撤销操作。

package com.luke.designpatterns.mementoPattern;

import java.util.ArrayList;
import java.util.List;

class TextEditorMemento {
    private String text;

    public TextEditorMemento(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

// 发起人
class TextEditor {
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public TextEditorMemento save() {
        return new TextEditorMemento(text);
    }

    public void restore(TextEditorMemento memento) {
        this.text = memento.getText();
    }
}

// 负责人
class TextEditorHistory {
    private List<TextEditorMemento> history = new ArrayList<>();

    public void save(TextEditorMemento memento) {
        history.add(memento);
    }

    public TextEditorMemento undo() {
        if (!history.isEmpty()) {
            history.remove(history.size() - 1);
            return history.get(history.size() - 1);
        }
        return null;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        TextEditor textEditor = new TextEditor();
        TextEditorHistory history = new TextEditorHistory();

        // 用户输入文本
        textEditor.setText("我先输入了一些内容");

        // 保存文本状态
        history.save(textEditor.save());

        // 用户继续编辑
        textEditor.setText("我又输入了一些内容!啦啦啦");

        // 再次保存文本状态
        history.save(textEditor.save());

        // 撤销一步
        TextEditorMemento memento = history.undo();
        if (memento != null) {
            textEditor.restore(memento);
            System.out.println("目前的内容是:" + textEditor.getText());
        }
    }
}

深究设计模式之-备忘录模式

在这个例子中,TextEditor 是发起人,负责创建备忘录和恢复内部状态。TextEditorMemento 是备忘录,存储发起人的内部状态。TextEditorHistory 是负责人,负责保存备忘录,但不能修改备忘录的内容。客户端代码使用文本编辑器输入文本,并通过保存备忘录的方式记录文本的编辑历史。用户可以通过撤销操作将文本恢复到之前的状态。备忘录模式使得对象的状态恢复变得简单,同时也能够有效地保存对象的历史状态

适用场景

备忘录模式适用于以下场景:

  1. 编辑器撤销功能: 在文本编辑器或图形设计软件中,用户可以执行一系列操作,如插入、删除、移动等。备忘录模式可用于保存每个操作前的编辑器状态,以便用户可以撤销到先前的状态。
  2. 游戏进度保存: 在游戏开发中,备忘录模式可用于保存游戏状态,使玩家能够在需要时返回到之前的关卡或进度。这类似于在游戏中保存进度点的功能。
  3. 配置文件管理: 当软件需要支持多个配置选项,并且用户可以随时更改这些选项时,备忘录模式可用于保存先前的配置状态。这样,用户可以随时还原到他们喜欢的配置。
  4. 事务管理系统: 在数据库管理系统或事务性应用中,备忘录模式可以用于记录每个事务的状态。如果某个事务失败,系统可以回滚到之前的状态,确保数据的一致性。
  5. 日志记录系统: 在应用程序中实现日志记录时,备忘录模式可以用于保存系统状态的快照,以便后续分析或故障排除。
  6. 图形软件的历史记录: 在图形软件中,用户对图形对象的操作可以通过备忘录模式进行记录。这样,用户可以查看并撤销每一步的操作,实现历史记录功能。

总的来说,备忘录模式在需要记录和恢复对象状态的情况下非常有用,尤其是在用户交互、状态管理和历史记录等方面。