使用Kotlin实现设计模式中的观察者模式

2025-03-11 08:43 使用Kotlin实现设计模式中的观察者模式已关闭评论

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的状态。在Kotlin中有多种方式实现观察者模式,下面为你介绍常见的两种方式。

传统方式实现

  1. 定义观察者接口:包含一个更新方法,当主题状态变化时会调用此方法。
  2. 定义主题接口:包含注册、移除观察者以及通知观察者的方法。
  3. 实现主题类:实现主题接口,并维护一个观察者列表。
  4. 实现观察者类:实现观察者接口。

示例代码如下:

// 观察者接口
interface Observer {
    fun update(subject: Subject)
}

// 主题接口
interface Subject {
    fun registerObserver(observer: Observer)
    fun removeObserver(observer: Observer)
    fun notifyObservers()
}

// 主题类实现
class ConcreteSubject : Subject {
    private val observers = mutableListOf<Observer>()
    private var state: Int = 0

    override fun registerObserver(observer: Observer) {
        observers.add(observer)
    }

    override fun removeObserver(observer: Observer) {
        observers.remove(observer)
    }

    override fun notifyObservers() {
        observers.forEach { it.update(this) }
    }

    fun setState(state: Int) {
        this.state = state
        notifyObservers()
    }

    fun getState(): Int {
        return state
    }
}

// 观察者类实现
class ConcreteObserver : Observer {
    override fun update(subject: Subject) {
        if (subject is ConcreteSubject) {
            println("Observer notified. Subject state is ${subject.getState()}")
        }
    }
}

使用示例:

fun main() {
    val subject = ConcreteSubject()
    val observer1 = ConcreteObserver()
    val observer2 = ConcreteObserver()

    subject.registerObserver(observer1)
    subject.registerObserver(observer2)

    subject.setState(10)
    subject.removeObserver(observer2)
    subject.setState(20)
}

使用Kotlin的 ObservableObserver 类(基于Java的 java.util.Observablejava.util.Observer

Java 提供了 java.util.Observablejava.util.Observer 来实现观察者模式,Kotlin 可以直接使用它们。

示例代码如下:

import java.util.*

// 主题类继承自 Observable
class ObservableSubject : Observable() {
    private var state: Int = 0

    fun setState(state: Int) {
        this.state = state
        setChanged()
        notifyObservers()
    }

    fun getState(): Int {
        return state
    }
}

// 观察者类实现 Observer 接口
class ObservableObserver : Observer {
    override fun update(o: Observable, arg: Any?) {
        if (o is ObservableSubject) {
            println("ObservableObserver notified. Subject state is ${o.getState()}")
        }
    }
}

使用示例:

fun main() {
    val subject = ObservableSubject()
    val observer1 = ObservableObserver()
    val observer2 = ObservableObserver()

    subject.addObserver(observer1)
    subject.addObserver(observer2)

    subject.setState(10)
    subject.deleteObserver(observer2)
    subject.setState(20)
}

这两种方式都能有效地实现观察者模式。传统方式更加灵活,能够完全自定义实现;而基于 java.util.Observablejava.util.Observer 的方式则利用了Java已有的框架,代码相对简洁。

当前文章价值1.57元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/3796.html ,谢谢支持!

资源分享

分类:kotlin 标签:,
Android控件ListView熟悉divider详细介绍和示例说明 Android控件ListView熟悉divi
一篇文章,学完TeachCourse2016成长笔记 一篇文章,学完TeachCourse201
Windows 10安装Rethinkdb配置启动服务 Windows 10安装Rethinkdb配置启
实例说明kotlin关键字companion object和lateinit的用法 实例说明kotlin关键字companion

评论已关闭!