MST

星途 面试题库

面试题:Kotlin观察者模式中Subject与Observer的常规实现方式

在Kotlin中,描述如何常规实现观察者模式里的Subject(被观察者)和Observer(观察者),并给出简单代码示例。
43.8万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

1. 定义Subject(被观察者)

在Kotlin中,可以通过Observable类或者自定义集合来管理观察者列表,并提供注册、注销和通知观察者的方法。

使用Observable类(Java原生的观察者模式支持,Kotlin可兼容使用):

import java.util.Observable
import java.util.Observer

class MySubject : Observable() {
    private var data: String? = null

    fun setData(newData: String) {
        data = newData
        setChanged()
        notifyObservers(data)
    }
}

自定义集合实现:

class Subject {
    private val observers = mutableListOf<Observer>()

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

    fun unregisterObserver(observer: Observer) {
        observers.remove(observer)
    }

    fun notifyObservers(data: Any?) {
        observers.forEach { it.update(this, data) }
    }
}

2. 定义Observer(观察者)

观察者需要实现Observer接口(如果使用Observable类),或者定义一个统一的更新方法。

使用Observable类相关的实现:

class MyObserver : Observer {
    override fun update(o: Observable, arg: Any?) {
        if (arg is String) {
            println("Observer received data: $arg")
        }
    }
}

自定义观察者接口实现:

interface Observer {
    fun update(subject: Subject, data: Any?)
}

class CustomObserver : Observer {
    override fun update(subject: Subject, data: Any?) {
        if (data is String) {
            println("Custom Observer received data: $data")
        }
    }
}

3. 使用示例

使用Observable类的示例:

fun main() {
    val subject = MySubject()
    val observer = MyObserver()
    subject.addObserver(observer)
    subject.setData("New data")
}

自定义集合实现的示例:

fun main() {
    val subject = Subject()
    val customObserver = CustomObserver()
    subject.registerObserver(customObserver)
    subject.notifyObservers("Some new data")
}