Java设计模式:备忘录模式详解
版权申诉
124 浏览量
更新于2024-07-08
收藏 115KB PDF 举报
"Java设计模式笔记中的备忘录模式(Memento Pattern)"
备忘录模式是一种行为设计模式,主要用于在不违反封装原则的前提下,保存一个对象的内部状态,并能在之后恢复该对象到之前保存的状态。这个模式的核心是通过创建一个备忘录对象来保存原对象(称为发起人角色,Originator)的内部状态,然后由另一个对象(称为负责人角色,Caretaker)负责存储和传递备忘录,确保只有发起人能够恢复其状态。
在备忘录模式中,存在以下三个主要角色:
1. 发起人角色(Originator):这是需要保存和恢复状态的对象。发起人创建备忘录对象,通常包含一个工厂方法用于创建备忘录,并且有一个恢复方法来利用备忘录恢复其状态。在给定的Java代码中,`Originator` 类有一个私有的 `state` 字符串字段,代表内部状态,以及创建和恢复备忘录的方法。
```java
public class Originator {
private String state;
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento memento) {
this.state = memento.getState();
}
}
```
2. 备忘录角色(Memento):备忘录对象负责存储发起人的内部状态。备忘录通常有两个接口:窄接口和宽接口。窄接口仅允许负责人对象持有备忘录,而宽接口则允许发起人访问并恢复其内部状态。备忘录类可能包含私有构造函数和访问器方法,以确保外部对象不能直接修改状态。
```java
public class Memento {
private String state;
// 私有构造函数
private Memento(String state) {
this.state = state;
}
// 宽接口(仅对发起人可见)
public String getState() {
return state;
}
}
```
3. 负责人角色(Caretaker):负责人对象负责保存备忘录,但不应查看或修改备忘录的内容。在实际应用中,负责人可能是一个集合类,用于存储多个备忘录,或者是一个简单的变量,仅保存单个备忘录。
```java
public class Caretaker {
private List<Memento> mementos = new ArrayList<>();
public void addMemento(Memento memento) {
mementos.add(memento);
}
public Memento getMemento(int index) {
return mementos.get(index);
}
}
```
备忘录模式常与其他设计模式结合使用,如命令模式和迭代器模式。例如,在命令模式中,备忘录模式可用于撤销操作,存储命令执行前的状态。在迭代器模式中,备忘录模式可以用于保存迭代过程中的某个状态,以便稍后恢复。
备忘录模式提供了一种安全的方式,允许对象在不破坏其封装性的情况下记录和恢复其状态,适用于需要保存和恢复状态的场景,如游戏存档、文本编辑器的撤销/重做功能等。然而,过度使用备忘录模式可能会导致内存消耗增加,因为需要存储多个状态的备忘录对象。因此,应谨慎评估何时使用备忘录模式,并权衡其带来的好处与潜在的性能影响。
2021-11-04 上传
2021-10-19 上传
2020-05-20 上传
2022-09-23 上传
hwx18537729388
- 粉丝: 1
- 资源: 9万+
最新资源
- Android圆角进度条控件的设计与应用
- mui框架实现带侧边栏的响应式布局
- Android仿知乎横线直线进度条实现教程
- SSM选课系统实现:Spring+SpringMVC+MyBatis源码剖析
- 使用JavaScript开发的流星待办事项应用
- Google Code Jam 2015竞赛回顾与Java编程实践
- Angular 2与NW.js集成:通过Webpack和Gulp构建环境详解
- OneDayTripPlanner:数字化城市旅游活动规划助手
- TinySTM 轻量级原子操作库的详细介绍与安装指南
- 模拟PHP序列化:JavaScript实现序列化与反序列化技术
- ***进销存系统全面功能介绍与开发指南
- 掌握Clojure命名空间的正确重新加载技巧
- 免费获取VMD模态分解Matlab源代码与案例数据
- BuglyEasyToUnity最新更新优化:简化Unity开发者接入流程
- Android学生俱乐部项目任务2解析与实践
- 掌握Elixir语言构建高效分布式网络爬虫