观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的状态。在Kotlin中有多种方式实现观察者模式,下面为你介绍常见的两种方式。
传统方式实现
- 定义观察者接口:包含一个更新方法,当主题状态变化时会调用此方法。
- 定义主题接口:包含注册、移除观察者以及通知观察者的方法。
- 实现主题类:实现主题接口,并维护一个观察者列表。
- 实现观察者类:实现观察者接口。
示例代码如下:
// 观察者接口
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的 Observable 和 Observer 类(基于Java的 java.util.Observable 和 java.util.Observer)
Java 提供了 java.util.Observable 和 java.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.Observable 和 java.util.Observer 的方式则利用了Java已有的框架,代码相对简洁。
当前文章价值1.57元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

评论已关闭!