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

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

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

主要角色:

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

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

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

示例:

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

java 复制代码
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. 图形软件的历史记录: 在图形软件中,用户对图形对象的操作可以通过备忘录模式进行记录。这样,用户可以查看并撤销每一步的操作,实现历史记录功能。

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

相关推荐
Asthenia041215 分钟前
chmod 和 chown 区别咋分?记忆小妙招来了!
后端
泉城老铁19 分钟前
使用springboot+Elasticsearch搭建本地化知识库搜索
后端
uhakadotcom21 分钟前
阿里云SchedulerX:分布式任务调度平台入门指南
后端·面试·github
bxp132123 分钟前
springcloud gateway搭建及动态获取nacos注册的服务信息信息
java·spring cloud·gateway
用户6955900422823 分钟前
关于OOP和POP
设计模式
caihuayuan525 分钟前
ApiBoot v2.2.5版本无法兼容Hoxton.SR5的SpringCloud Gateway
java·大数据·spring boot·后端·课程设计
奕川26 分钟前
多模块 Gradle Java 项目发布到新 Maven中央仓库最新指南
后端
用户7851278147026 分钟前
如何使用 Java 获取淘宝分类详情接口(cat_get)
java
舒一笑27 分钟前
云服务器中如何查看服务器具体运行哪些服务
linux·后端
寻月隐君29 分钟前
深入剖析 Go 接口底层实现:从 eface 到 iface(基于 Go 1.24 源码)
后端·go·github