Kotlin~Observer观察者模式

概念

定义一对多的依赖关系,让多个观察者同时监听一个主题对象。

角色介绍

  • Subject:主题,也称被观察者,它是具有状态的对象维护着一个观察者列表。提供添加、删除和通知观察者的方法。
  • ConcreteSubject:具体主题,主题的具体实现类,维护观察者列表,状态改变时通知观察者。
  • Observer:观察者,接受主题通知的对象,需实现一个更新方法。
  • ConcreteObserver:具体观察者,观察者的具体实现类,定义收到主题通知后需要执行的具体操作。

UML

代码实现

kt 复制代码
import kotlin.properties.Delegates

class TextView {
    var listener: TextChangedListener? = null

    // 可观察者属性,接收两个参数 初始值;修改处理器handler,handler会在每次赋值时调用,接收三个参数:当前属性声明,旧值,新值
    // Delegates.vetoable 可对属性赋值进行拦截,返回false即为拦截
    var text: String by Delegates.observable("init") { _, oldValue, newValue ->
        listener?.onChanged(oldValue, newValue)
    }
    var value: Int by Delegates.vetoable(0) { _, oldValue, newValue ->
        val ret = newValue > 0
        listener?.onChanged(oldValue, newValue, ret)
        ret
    }
}

fun main() {

    val textView = TextView().apply {
        listener = TextChanged()
    }
    textView.text = "first"
    textView.text = "second"
    textView.run {
        value = 1
        println("vetoable: ${value}")
        value = 5
        println("vetoable: ${value}")
    }
}

控制台输出:

onChanged: init --> first

onChanged: first --> second

onChanged: true 0 --> 1

vetoable: 1

onChanged: true 1 --> 5

vetoable: 5

优缺点

优点

  • 广播通信
  • 低耦合
  • 支持事件处理

缺点

  • 开销较大
  • 实现较复杂

应用场景

多对象间广播通信,一个对象的改变需要通知其他对象改变。

  • 社交媒体平台
  • 股票市场
  • GUI工具
  • 实时消息系统

总结

java提供了java.util.Observable 类和java.util.Observer接口来帮助实现观察者模式,kt中我们可以通过委托属性实现,更简洁优雅。

安卓中LiveData、EventBus等都是基于观察者设计实现的。

关于委托属性参考:

相关推荐
JMchen12312 小时前
Jetpack 内核实战(九):实战(上)——记事本首页列表 + 搜索功能开发
kotlin·android 实战·记事本 app 开发·recyclerview 优化·jetpack 综合实战
pengyu14 小时前
【Kotlin 协程修仙录 · 炼虚境 · 初阶】 | 虚空造物:Channel 基础与协程间通信的管道艺术
android·前端·kotlin
小强闯江湖14 小时前
ViewCompose:让原生 Android View 进入声明式时代
android·开源·kotlin
雨白18 小时前
Kotlin 委托机制:搞懂“老板与秘书”模式
kotlin
pengyu2 天前
【Kotlin 协程修仙录 · 化神境 · 后阶】 | 异常天劫:Flow 异常处理的终极奥义与重试之道
android·kotlin
pengyu2 天前
【Kotlin 协程修仙录 · 化神境 · 中阶】 | 多播奥义:SharedFlow 高级配置与 Channel 的抉择之道
android·kotlin
撩得Android一次心动2 天前
Kotlin 语言【知识点整理2】
android·开发语言·kotlin
Android打工仔3 天前
Kotlin 协程源码解析(五):BaseContinuationImpl.resumeWith() —— Continuation 链是如何被展开的?
android·kotlin
Android-Flutter3 天前
android Glide 源码流程分析
android·kotlin
Android-Flutter3 天前
android Glide 使用详解
android·kotlin