版权声明:本文为博主原创文章,但部分内容来源网络,如有侵权,告知即删! https://blog.csdn.net/chenyuan_jhon/article/details/78296334
- 定义:
观察者模式定义了对象之间的一对多的依赖关系,当一个主题(Subject)对象的状态发生改变时,他的依赖者(Observer)都会收到通知。 - 概述
此模式有四个比较重要的类,下面一一说明
主题类(Subject)
可以是抽象类也可以是接口,具体的主题要实现该类
具体主题类(WeatherData)
实现Subject的类
观察者接口类(Observer)
用于通知每个观察者更新数据
具体观察者(CurrentConditionsDisplsy)
展示主题数据 通用类图
实例(Kotlin语言)
以下是主题及具体主题
//subject
interface Subject {
fun registerObserver(observer: Observer)
fun removeObserver(observer: Observer)
fun notifyObservers()
}
//具体主题
class WeatherDataSubject : Subject {
val arrayList: ArrayList<Observer> = ArrayList()
var temp: String = "晴空万里"
override fun registerObserver(observer: Observer) {
arrayList.add(observer)
}
override fun removeObserver(observer: Observer) {
val indexOf = arrayList.indexOf(observer)
if (indexOf >= 0) {
arrayList.remove(observer)
}
}
override fun notifyObservers() {
arrayList.indices
.map { arrayList[it] }
.forEach { it.update(this) }
}
fun setContent(temp: String) {
this.temp = temp
notifyObservers()
}
}
以下是观察者及具体观察者
//Observer
interface Observer {
fun update(subject: Subject)
}
//具体Observer
class CurrentConditionsObserver :Observer,DisPlayElement {
lateinit var temp:String
val subject:Subject
constructor(subject: Subject){
this.subject = subject
subject.registerObserver(this)
}
override fun update(subject: Subject) {
println("CurrentConditionsDisplay收到天气变化")
this.temp = (subject as WeatherDataSubject).temp
display()
}
override fun display() {
println(temp)
}
}
以下是显示板的接口
interface DisPlayElement {
fun display()
}
以下是测试及测试结果
fun main(args: Array<String>) {
val weatherData = WeatherDataSubject()
println(weatherData.temp)
weatherData.setContent("天气变化了-->瓢泼大雨")
val display = CurrentConditionsObserver(weatherData)
display.update(weatherData)
}
//测试结果
晴空万里
CurrentConditionsDisplay收到天气变化
天气变化了-->瓢泼大雨
Process finished with exit code 0
- 本例类图
如有错误,请留言更正,或进580725421群讨论,以免误导其他开发者!!!