本文已使用 Google Cloud Translation API 自动翻译。
某些文档最好以原文阅读。
观察者模式是一种软件设计模式,其中一个对象(称为主题)维护其从属列表(称为观察者),并自动通知它们任何状态更改,通常是通过调用它们的方法之一。
它是实现事件驱动系统非常有用的模式,也是行为设计模式之一。
观察者模式是一种软件设计模式,其中一个对象(称为主题)维护其从属列表(称为观察者),并自动通知它们任何状态更改,通常是通过调用它们的方法之一。
它是实现事件驱动系统非常有用的模式,也是行为设计模式之一。
观察者模式有以下参与者:
观察者模式用于以下情况:
Kotlin 没有内置观察者模式,但很容易实现。
首先,让我们创建 Subject 接口:
interface Subject {
fun addObserver(observer: Observer)
fun removeObserver(observer: Observer)
fun notifyObservers()
}
可以看到,Subject接口有3个方法:
现在让我们创建 Observer 接口:
interface Observer {
fun update(subject: Subject)
}
Observer 接口只有一个方法:
现在让我们创建一个实现 Subject 接口的 ConcreteSubject 类:
class ConcreteSubject : Subject {
private val observers = mutableListOf<Observer>()
private var state: Int = 0
override fun addObserver(observer: Observer) {
observers.add(observer)
}
override fun removeObserver(observer: Observer) {
observers.remove(observer)
}
override fun notifyObservers() {
for (observer in observers) {
observer.update(this)
}
}
fun setState(state: Int) {
this.state = state
notifyObservers()
}
fun getState(): Int {
return state
}
}
如您所见,ConcreteSubject 类维护了一个观察者列表,并在主体的状态发生变化时通知他们。
最后,让我们创建一个实现 Observer 接口的 ConcreteObserver 类:
class ConcreteObserver : Observer {
private var state: Int = 0
override fun update(subject: Subject) {
state = subject.getState()
}
fun getState(): Int {
return state
}
}
ConcreteObserver 类仅存储主题的状态并提供访问它的 getter 方法。
现在让我们编写一个测试来查看观察者模式的运行情况:
import org.junit.Test
import kotlin.test.assertEquals
class ObserverPatternTest {
@Test
fun testObserverPattern() {
val subject = ConcreteSubject()
val observer1 = ConcreteObserver()
val observer2 = ConcreteObserver()
subject.addObserver(observer1)
subject.addObserver(observer2)
subject.setState(1)
assertEquals(1, observer1.getState())
assertEquals(1, observer2.getState())
subject.setState(2)
assertEquals(2, observer1.getState())
assertEquals(2, observer2.getState())
subject.removeObserver(observer1)
subject.setState(3)
assertEquals(2, observer1.getState())
assertEquals(3, observer2.getState())
}
}
在这个测试中,我们首先创建一个 ConcreteSubject 和两个 ConcreteObservers。然后我们将观察者添加到主题并更改主题的状态。我们断言观察者的状态已相应改变。最后,我们移除其中一个观察者并再次改变对象的状态。我们断言只有剩下的观察者的状态发生了变化。