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

优缺点

优点

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

应用场景

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

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

总结

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

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

参考:

相关推荐
帅次2 小时前
Flutter Container 组件详解
android·flutter·ios·小程序·kotlin·iphone·xcode
帅次6 小时前
Flutter setState() 状态管理详细使用指南
android·flutter·ios·小程序·kotlin·android studio·iphone
移动开发者1号10 小时前
Compose列表项动画实现指南
android·kotlin
移动开发者1号10 小时前
Compose与View系统互操作方案
android·kotlin
heeheeai1 天前
kotlin kmp 副作用函数 effect
kotlin·effect·kmp·副作用函数
蔡蓝1 天前
设计模式-备忘录模式
java·设计模式·备忘录模式
纳于大麓1 天前
Kotlin基础语法一
android·开发语言·kotlin
KotlinKUG贵州1 天前
Spring开发,从Kotlin开始
spring boot·spring·kotlin
移动开发者1号1 天前
Android中Activity、Task与Process的关系
android·kotlin
移动开发者1号1 天前
Activity onCreate解析
android·kotlin