行为型 中等
备忘录模式
Memento Pattern
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
概述
备忘录模式是一种行为设计模式,允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
适用场景
- •当需要创建对象状态快照来恢复其之前的状态时
- •当直接访问对象的成员变量、获取器或设置器将导致封装被突破时
优点
- +可以在不破坏对象封装的情况下创建对象状态快照
- +可以通过让负责人维护备忘录历史记录来简化原发器代码
缺点
- −如果客户端过于频繁地创建备忘录,程序将消耗大量内存
- −负责人必须完整跟踪原发器的生命周期,这样才能销毁弃用的备忘录
结构
classDiagram
class Originator {
-state: string
+setState(state: string)
+save(): Memento
+restore(m: Memento)
}
class Memento {
-state: string
-date: Date
+getState(): string
+getDate(): Date
}
class Caretaker {
-mementos: List~Memento~
-originator: Originator
+backup()
+undo()
+showHistory()
}
class Client {
+main()
}
Originator --> Memento : creates
Caretaker o--> Memento : manages
Caretaker --> Originator : uses
Client ..> Caretaker : uses
Client ..> Originator : uses
style Originator fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
style Memento fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Caretaker fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
style Client fill:#f5f5f5,stroke:#616161,stroke-width:1px
交互演示
捕获和恢复对象状态
OriginatorTextEditor
"Hello"
备忘录历史
编辑内容后保存状态,可以随时恢复到之前的状态
生活类比
备忘录就像是游戏存档
游戏存档
你可以随时保存游戏状态(备忘录),之后可以加载存档回到之前的状态。
代码实现
Example.java
实际应用
Git Version Control
Git 的版本控制就是备忘录模式的典型应用,可以保存和恢复代码状态。
Example.java
文本编辑器的撤销功能
大多数文本编辑器(如 VS Code、Sublime Text)使用备忘录模式实现撤销/重做功能。
Example.java
数据库事务回滚
数据库系统使用备忘录模式保存事务开始前的状态,以便在回滚时恢复。
Example.java
练习
1
备忘录模式的主要目的是什么?
2
备忘录模式中,管理者(Caretaker)可以直接访问备忘录的内部状态吗?
3