对象行为型模式——观察者模式(Observer Pattern)

版权声明:本文为博主原创文章,但部分内容来源网络,如有侵权,告知即删! 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群讨论,以免误导其他开发者!!!

猜你喜欢

转载自blog.csdn.net/chenyuan_jhon/article/details/78296334