概念
备忘录模式是一种行为型设计模式,用于捕获和存储对象的内部状态,并在需要时将对象恢复到之前的状态。
备忘录模式允许在不暴露对象内部实现细节的情况下,对对象进行状态的保存和恢复。
角色介绍
- Originator:原发器,负责创建备忘录对象,并将其当前状态保存到备忘录中,也可以从备忘录中恢复自身状态。
- Memento:备忘录,用于存储发起人的状态,通常具备对发起人状态的访问权限。
- Caretaker:管理者,负责管理备忘录对象,可以保存多个备忘录对象,并在需要时将其提供给发起人进行状态的恢复。
UML
代码实现
/*** 备忘录*/
data class Memento(val state: String? = null
)/*** 原发器*/
class Originator {var state: String? = nullfun save(): Memento {return Memento(state)}fun recover(memento: Memento) {state = memento.state}}/*** 看管人*/
class Caretaker {private val mementos = ArrayList<Memento>()fun addMemento(memento: Memento) {mementos.add(memento)}fun getMemento(i: Int): Memento {return mementos[i]}
}fun main() {val originator = Originator()val caretaker = Caretaker()originator.state = "State#1"originator.state = "State#2"caretaker.addMemento(originator.save())originator.state = "State#3"caretaker.addMemento(originator.save())originator.state = "State#4"println("Current State:${originator.state}")originator.recover(caretaker.getMemento(0))println("0 State:${originator.state}")originator.recover(caretaker.getMemento(1))println("1 State:${originator.state}")
}
优缺点
优点
- 封装性
- 简易恢复和撤销
- 简化发起人
缺点 - 增加内存使用
- 性能开销
- 复杂性
应用场景
适用于需要维护对象状态的历史记录,而不想暴露复杂的内部状态。
- 文本编辑器
- 绘图应用程序
- 数据库系统
- 游戏开发
- 版本控制系统
总结
备忘录适用于需要保存/恢复数据的相关状态场景,并提供一个可回滚的操作。
为了符合迪米特原则,还需增加一个管理备忘录的类;为了节省内容可使用配合原型模式使用。
参考:
- https://www.cnblogs.com/jiangzhaowei/p/7287359.html
- https://www.runoob.com/design-pattern/memento-pattern.html
- https://www.cnblogs.com/cativen/p/16641173.html