Observer

偶尔善良 提交于 2019-12-12 16:50:56

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1 观察者模式结构图

2 观察者模式结构实现

/**
 * 观察者模式
 * @author Wenwu 2019/12/11
 */
/**
 * 抽象观察者
 * @author Wenwu 2019/12/11
 */
interface Observer{
    /**
     * 观察者名称
     * @author Wenwu 2019/12/11
     */
    val observerName: String
    /**
     * 当主体状态改变时,更新通知
     * @param msg 通知消息
     * @author Wenwu 2019/12/11
     */
    fun update(msg: String)
}

/**
 * 抽象主题(抽象被观察者)
 * 定义主题行为
 * @author Wenwu 2019/12/11
 */
interface Subject {
    // 观察者们
    val observers: MutableList<Observer>
    // 通知观察者的消息
    var msg: String
    // 添加观察者
    fun addObserver(o: Observer) {
        if (!observers.contains(o)) observers.add(o)
    }
    // 删除观察者
    fun deleteObserver(o: Observer) {
        if (observers.contains(o)) observers.remove(o)
    }
    // 通知观察者
    fun notifyObserver() {
        observers.forEach{
            it.update(msg)
        }
    }
}

/**
 * 具体的观察者
 * @author Wenwu 2019/12/11
 */
class ConcreteObserver(override val observerName: String): Observer {
    override fun update(msg: String) {
        println(msg)
    }
}

/**
 * 具体主题(具体被观察者)
 * @author Wenwu 2019/12/11
 */
class ConcreteSubject: Subject {
    /**
     * 初始化观察者们对象
     * @author Wenwu 2019/12/11
     */
    override val observers = mutableListOf<Observer>()
    override var msg: String = ""

    override fun notifyObserver() {
        observers.forEach{
            it.update("hello, ${it.observerName}!")
        }
    }

    /**
     * 一个具体的行为
     * @author Wenwu 2019/12/11
     */
    fun say() {
        notifyObserver()
    }
}

fun main(args: Array<String>) {
    // 生成三个观察者
    val observerA = ConcreteObserver("观察者 A")
    val observerB = ConcreteObserver("观察者 B")
    val observerC = ConcreteObserver("观察者 C")
    // 生成一个主题
    val subjectA = ConcreteSubject()
    // 添加观察者
    subjectA.addObserver(observerA)
    subjectA.addObserver(observerB)
    subjectA.addObserver(observerC)
    // 调用say,同时通知观察者
    subjectA.say()
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!