Kotlin~Memento备忘录模式

概念

备忘录模式是一种行为型设计模式,用于捕获和存储对象的内部状态,并在需要时将对象恢复到之前的状态。

备忘录模式允许在不暴露对象内部实现细节的情况下,对对象进行状态的保存和恢复。

角色介绍

  • Originator:原发器,负责创建备忘录对象,并将其当前状态保存到备忘录中,也可以从备忘录中恢复自身状态。
  • Memento:备忘录,用于存储发起人的状态,通常具备对发起人状态的访问权限。
  • Caretaker:管理者,负责管理备忘录对象,可以保存多个备忘录对象,并在需要时将其提供给发起人进行状态的恢复。

UML

代码实现

kt 复制代码
/**
 * 备忘录
 */
data class Memento(
    val state: String? = null
)

/**
 * 原发器
 */
class Originator {
    var state: String? = null

    fun 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}")
}

优缺点

优点

  • 封装性
  • 简易恢复和撤销
  • 简化发起人
    缺点
  • 增加内存使用
  • 性能开销
  • 复杂性

应用场景

适用于需要维护对象状态的历史记录,而不想暴露复杂的内部状态。

  • 文本编辑器
  • 绘图应用程序
  • 数据库系统
  • 游戏开发
  • 版本控制系统

总结

备忘录适用于需要保存/恢复数据的相关状态场景,并提供一个可回滚的操作。

为了符合迪米特原则,还需增加一个管理备忘录的类;为了节省内容可使用配合原型模式使用。

参考:

相关推荐
汪海游龙19 小时前
流式回复结尾的那一下闪:逐帧定位 Compose 聊天列表的三处布局跳动
android·性能优化·kotlin
传奇开心果编程21 小时前
【Compose Multiplatform跨端声明式UI实用技术】第20课:CMP跨平台经典示例深度解析
kotlin·移动开发·跨平台·编程语言理论·开发范式·编程框架·声明式ui
敲代码的瓦龙1 天前
Jetpack?lifecycle!!!
android·kotlin
Kapaseker1 天前
为什么程序员始终无法彻底解决内存泄漏?
android·kotlin
汤姆宝库1 天前
推理工程深拆:调度、量化与投机解码
android·开发语言·kotlin
传奇开心果2 天前
【Compose Multiplatform跨端声明式UI实用技术】第9课:跨平台 ViewModel 与状态架构
android·kotlin
andyweike2 天前
kotlin dsl library工程怎么配置
android·开发语言·kotlin
high一马平川3 天前
# SystemUI Dagger2 精读 · 第 2 章 @Inject:1200 处构造注入,和 1 处例外
android·java·kotlin
小铁-Android3 天前
CompletableDeferred:Kotlin 协程中用于一次性挂起通信的工具
android·kotlin