面试题答案
一键面试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")
}