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

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

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

相关推荐
better_liang12 分钟前
每日Java面试场景题知识点之-分布式事务处理
java·微服务·面试·springcloud·分布式事务
执笔论英雄35 分钟前
Slime异步原理(单例设计模式)4
开发语言·python·设计模式
q***96582 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
L***d6702 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
凌波粒2 小时前
Springboot基础教程(3)--自动装配原理/静态资源处理/欢迎页
java·spring boot·后端
likuolei2 小时前
XSL-FO 软件
java·开发语言·前端·数据库
凌波粒2 小时前
SpringBoot基础教程(2)--yaml/配置文件注入/数据校验/多环境配置
java·spring boot·后端·spring
S***26752 小时前
Spring Boot环境配置
java·spring boot·后端
6***83052 小时前
什么是Spring Boot 应用开发?
java·spring boot·后端
毕设源码柳学姐2 小时前
计算机毕设 java 智慧社区服务系统 SSM 框架社区生活平台 Java 开发的便民服务与互动系统
java·开发语言·生活