23种设计模式——备忘录模式(Memento Pattern)
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式——备忘录模式(Memento Pattern)
📚 ** ps ** :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。
目录
一. 背景
二. 介绍
三. 主要角色
四. 代码示例
五. 应用场景
六. 优缺点
七. 总结
一. 背景
备忘录模式,就像它的名字一样,是用来记录某些功能的设计模式,并且能够进行之后的查阅。在实际很多类似游戏的档案保存、设置保存。或多或少都存在备忘录模式的身影。下面,我将为你详细的介绍备忘录模式以及它的一些基本使用!
二. 介绍
备忘录模式(Memento Pattern)是23种经典设计模式中的一种,属于行为型模式。它的主要目的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便日后可以将该对象恢复到原先保存的状态。
三. 主要角色
- Originator(发起人):需要保存状态的对象,可以创建一个备忘录来记录当前时刻自身的状态,并可以使用备忘录恢复内部状态。
- Memento(备忘录):负责存储Originator对象的内部状态,可以防止Originator以外的其他对象访问备忘录。
- Caretaker(管理者):负责存储备忘录,但不能对备忘录的内容进行操作或检查。
四. 代码示例
// Memento类
class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}// Originator类
class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento saveStateToMemento() {return new Memento(state);}public void getStateFromMemento(Memento memento) {state = memento.getState();}
}// Caretaker类
class Caretaker {private Memento memento;public void setMemento(Memento memento) {this.memento = memento;}public Memento getMemento() {return memento;}
}// 使用示例
public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("State #1");originator.setState("State #2");caretaker.setMemento(originator.saveStateToMemento());originator.setState("State #3");System.out.println("Current State: " + originator.getState());originator.getStateFromMemento(caretaker.getMemento());System.out.println("Restored State: " + originator.getState());}
}
五. 应用场景
- 需要保存和恢复数据的相关场景。
- 撤销操作的实现,如文本编辑器的撤销功能。
- 事务回滚操作,如数据库事务的回滚。
六. 优缺点
备忘录模式的优点
- 保护对象的封装性,避免暴露其内部细节。
- 简化了Originator类的职责,让其不需要管理和保存其内部状态的副本。
- 提供了一种状态恢复机制,可以方便地将对象恢复到某个历史状态。
备忘录模式的缺点
- 如果需要保存的状态较多,会占用大量的内存资源。
- 在某些语言或环境中,实现备忘录模式可能较为复杂,需要考虑访问权限控制等问题。
七. 总结
备忘录模式提供了一种状态恢复机制,可以在不破坏对象封装性的前提下保存和恢复对象的内部状态。虽然它可能会占用较多内存,但在需要撤销操作或事务回滚等场景中非常有用。