设计模式

设计模式 ~ 观察者模式

2021-11-10  本文已影响0人  BTPJ
/**
 * 观察者的接口
 *
 * @author LTP  2021/11/10
 */
interface Observer {

    /**
     * 定义一个收到被观察者改变而更新的动作
     *
     * @param msg 收到的消息
     */
    fun update(msg: String)
}
/**
 * 具体观察者
 * @author LTP  2021/11/10
 */
class ConcreteObserver(private val name: String) : Observer {

    override fun update(msg: String) {
        println("${name}被通知:$msg")
    }
}
/**
 * 定义被观察者接口
 * @author LTP  2021/11/10
 */
interface Subject {

    /**
     * 绑定观察者
     * @param observer 观察者
     */
    fun attach(observer: Observer)

    /**
     * 解绑观察者
     * @param observer 观察者
     */
    fun detach(observer: Observer)

    /**
     * 通知观察者
     * @param msg 通知的内容
     */
    fun notify(msg: String)
}
/**
 * 具体被观察者
 *
 * @author LTP  2021/11/10
 */
class ConcreteSubject : Subject {
    /** 存储绑定的观察者 */
    private val mObserverList = ArrayList<Observer>()

    override fun attach(observer: Observer) {
        mObserverList.add(observer)
    }

    override fun detach(observer: Observer) {
        mObserverList.remove(observer)
    }

    override fun notify(msg: String) {
        // 循环遍历观察者逐个通知
        mObserverList.forEach { observer -> observer.update(msg) }
    }
}
/**
 * 调用类
 *
 * @author LTP  2021/11/10
 */
class Main {

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val subject = ConcreteSubject()

            val observer1 = ConcreteObserver("观察者1")
            val observer2 = ConcreteObserver("观察者2")
            val observer3 = ConcreteObserver("观察者3")

            subject.attach(observer1)
            subject.attach(observer2)
            subject.attach(observer3)

            subject.notify("我要更新啦")

            subject.detach(observer2)
            subject.notify("我删掉观察者2再更新一次")
        }
    }
}
运行结果:
  观察者1被通知:我要更新啦
  观察者2被通知:我要更新啦
  观察者3被通知:我要更新啦
  观察者1被通知:我删掉观察者2再更新一次
  观察者3被通知:我删掉观察者2再更新一次
上一篇 下一篇

猜你喜欢

热点阅读