设计模式:备忘录模式

news/2024/10/21 17:20:34/

定义

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的前提下,捕获和外部化对象的内部状态,以便在将来某个时刻可以将该对象恢复到此状态。备忘录模式使用三个类类型来实现:发起人(Originator)、备忘录(Memento)和看护人(Caretaker)。

应用场景

备忘录模式主要用于实现对象的状态保存和恢复,常见的应用场景包括:

  • 撤销操作(Undo):如文本编辑器的撤销功能。
  • 游戏存档:保存游戏进度,以便玩家可以从某个点重新开始。
  • 系统备份与恢复:在系统可能进入不稳定状态之前保存其状态,便于后续恢复。

示例与反例

示例

假设我们开发一个简单的文本编辑器,我们需要实现撤销(Undo)功能。这里可以使用备忘录模式:

  • 发起人(Originator):文本编辑器,可以输出当前内容的备忘录,并且可以根据备忘录恢复内容。
  • 备忘录(Memento):保存编辑器某一时刻的状态(文本内容)。
  • 看护人(Caretaker):负责保存备忘录,但不修改或检查备忘录的内容。

让我们通过一个简单的例子来演示备忘录模式的使用。假设我们有一个简单的文本编辑器类,我们希望能够保存当前的文本状态,并在需要时恢复到之前的状态。

步骤 1: 定义备忘录类(Memento)

public class TextEditorMemento {private final String state;public TextEditorMemento(String state) {this.state = state;}public String getState() {return state;}
}

步骤 2: 定义发起人类(Originator)

public class TextEditor {private String text;public void setText(String text) {this.text = text;}public String getText() {return text;}public TextEditorMemento save() {return new TextEditorMemento(text);}public void restore(TextEditorMemento memento) {text = memento.getState();}
}

步骤 3: 定义看护人类(Caretaker)

import java.util.ArrayList;
import java.util.List;public class Caretaker {private final List<TextEditorMemento> mementoList = new ArrayList<>();public void addMemento(TextEditorMemento memento) {mementoList.add(memento);}public TextEditorMemento getMemento(int index) {return mementoList.get(index);}
}

步骤 4: 使用备忘录模式

public class Main {public static void main(String[] args) {TextEditor editor = new TextEditor();Caretaker caretaker = new Caretaker();editor.setText("Version 1");caretaker.addMemento(editor.save());System.out.println("Current Text: " + editor.getText());editor.setText("Version 2");caretaker.addMemento(editor.save());System.out.println("Current Text: " + editor.getText());editor.restore(caretaker.getMemento(0));System.out.println("After Undo: " + editor.getText());}
}

输出:

Current Text: Version 1
Current Text: Version 2
After Undo: Version 1

在这个例子中,TextEditor类是发起人,它能够保存自己的状态到备忘录对象TextEditorMemento中,也能从备忘录对象恢复状态。Caretaker类负责保存备忘录对象,但不对这些对象进行操作或检查。

这个简单的示例展示了备忘录模式如何用于实现撤销功能。然而,在实际应用中,根据具体的需求,可能需要更复杂的逻辑来管理状态的保存和恢复。

反例

对于需要频繁读取和修改状态的情况,使用备忘录模式可能会引起性能问题,因为每次保存状态都需要创建备忘录对象,这在状态较大或保存频繁时可能会消耗大量内存。

原则间的权衡与冲突

备忘录模式在实现功能(如撤销操作)和保护封装性之间做了权衡。它允许恢复对象状态而不破坏其封装性,但这可能会增加系统的复杂性,并可能导致性能和内存使用上的问题。

设计模式的局限性

  • 资源消耗:如果对象状态大或变化频繁,备忘录模式可能会导致高内存消耗。
  • 封装性破坏:虽然备忘录模式本身是为了保护封装性,但在某些实现中,为了保存对象状态,可能需要破坏其封装性,使得备忘录可以访问对象的内部状态。
  • 复杂性增加:引入备忘录模式会增加系统的复杂性,需要更多的类和接口来管理状态的保存和恢复。

总结与建议

备忘录模式是一种非常有用的设计模式,特别适合那些需要恢复到之前状态的场景。然而,设计者应当注意其可能带来的性能和复杂性问题。在实际应用中,应当权衡是否真正需要备忘录模式,或者是否有更简单或更高效的方法来实现相同的功能。例如,对于简单的撤销功能,可能使用命令模式更为合适;而对于状态频繁变化的系统,可能需要考虑更高效的状态管理方法。


http://www.ppmy.cn/news/1423278.html

相关文章

Flowable工作流引擎:Spring Boot集成指南

Flowable工作流引擎&#xff1a;Spring Boot集成指南 前言开始集成相关配置文件pom文件 前言 在快速变化的软件开发世界中&#xff0c;工作流管理成为了企业应用不可或缺的组成部分。无论是简化复杂业务流程、提升操作效率还是确保流程的一致性和透明性&#xff0c;一个强大的…

前端网络---http协议演变

http协议的演变 什么是http协议&#xff1f; HTTP 协议全称为 Hypertext Transfer Protocol&#xff0c;即超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络传输协议 http协议演变 1991年0.9版本-------1996年1.0版本-------1997年1.1版本--------2015年2版本-…

走 https 和不走 https 对前端有什么影响

走 https 和不走 https 对前端有什么影响 之前网站走的是 https &#xff0c;自从域名那边改成需要三个月就要更新之后就没有再用 https&#xff0c;现在都是走的 http&#xff0c;使用中遇到了几个比较明显的功能限制。 最直接的影响就是不能使用 ServiceWorker 了&#xff…

简述Kafka的高可靠性

什么叫可靠性&#xff1f; 大家都知道&#xff0c;系统架构有三高&#xff1a;「高性能、高并发和高可用」&#xff0c;三者的重要性不言而喻。 对于任意系统&#xff0c;想要同时满足三高都是一件非常困难的事情&#xff0c;大型业务系统或者传统中间件都会搭建复杂的架构来…

病毒繁殖-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第52讲。 病毒繁殖&#xf…

IDEA远程调试debug

IDEA远程调试debug jar包启动脚本配置IDEA配置 通俗的说&#xff1a;本地有代码&#xff0c;服务器项目出现问题&#xff0c;环境的中间件配置不同&#xff0c;用idea远程调试&#xff0c;能快速定位问题&#xff0c;解决问题。 jar包启动脚本配置 jdk5-8写法 java -Xdebug -…

Linux:Redis7.2.4的源码包部署(2)

本章使用的是centos9进行部署 1.获取rpm安装包 Index of /releases/ (redis.io)https://download.redis.io/releases/这个网站有历史的版本&#xff0c;我这里使用的是最新版7.2.4进行安装 点击即可进行下载 方进Linux中&#xff0c;如果你的Linux中可以直接使用wget去下载 2…

Ubuntu 22.04安装中文输入法

1. 安装 sudo apt install fcitx5 2. 管理已安装的语言 Setting->Region & Language->Manage Installed Language 在下图中点击“安装”&#xff0c;之后需要等一会 选择Fcitx 5 3. 添加输入法 Setting->Keyboard 点击chinese 选择你想要的输入法 重启一下&a…