kotlin-设计模式-观察者模式

1、观察者模式介绍
    观察者模式是一个使用频率非常高的模式,最常用的地方是订阅-发布系统。 
    该模式的最重要的作用就是解耦,使观察者和被观察者之间依赖尽可能小,甚至无依赖。
2、观察者模式的定义
定义对象间一种一对多的关系,使得每当一个对象改变状态,所有依赖它的对象都会得到通知并更新。     

观察者4中角色:
1、Subject:抽象主题(被观察者,Observable接口),把所有观察者对象的引用保持在一个集合,每个主题可以有多个观察者
2、ConcreteSubject:具体主题(实现Observable接口的具体实现类),在内部发送变化后,通知所有注册过的观察者。
3、Observer:抽象观察者,定义了一个更新接口,得到主题更改通知的时候更新自己
4、ConcreteObserver:具体观察者,实现了抽象观察者的更新接口,以便在主题状态发送变化的时候更新自身状态。

Android中的使用:
1、EventBus
2、adapter.notifyDataSetChanged()

第一种使用系统的Observer和Observable实现:

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/1/13 22:27
 * Description : 观察者, 实现Observer接口
 */
class StaffObserver : Observer{

    var name : String = ""

    constructor(name : String){
        this.name = name
    }

    override fun update(o: Observable, arg: Any) {
        var msg = "Hi ${name}, 发布内容:${arg}"
        LogUtils.i(msg)
    }
}
/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/1/13 22:26
 * Description : 公司给所有员工发布消息 被观察者, 继承Observable类
 */
class CompanyObservable : Observable(){

    /**
     * 发布消息
     */
    fun publicMessage(content : String){
        setChanged()
        notifyObservers(content)
    }

}

测试调用:

private var company = CompanyObservable()
private var staff1 = StaffObserver("test1")
private var staff2 = StaffObserver("test2")
private var staff3 = StaffObserver("test3")

/**
 * 注册观察者
 */
private fun initObserver(){
    company.addObserver(staff1)
    company.addObserver(staff2)
    company.addObserver(staff3)
}

/**
 * 发布消息
 */
private fun processObserver(){
    company.publicMessage("过年放假8天")
}

/**
 * 删除了观察者,再发布信息,就接收不到
 */
private fun deleteObserver(){
    company.deleteObserver(staff2)
}

第二种使用自定义Observer和Observable实现:

(其实就是接口调用,使用系统的Observer和Observable也是一样道理)

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/1/13 22:50
 * Description : 定义观察者接口
 */
interface Staff2ObserverInter {
    fun publicMessage(msg : String)
}
/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/1/13 22:51
 * Description : 定义观察者实现类
 */
class Staff2ObserverImpl : Staff2ObserverInter{

    override fun publicMessage(msg : String) {
        LogUtils.i("Staff2ObserverInter publicMessage msg : ${msg}")
    }
}
/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2025/1/13 22:53
 * Description : 公司给所有员工发布消息 定义被观察者
 */
class Company2Observable {

    //保存观察者列表
    var mListObserver = mutableListOf<Staff2ObserverImpl>()

    /**
     * 注册观察者
     */
    fun registerObservable(staff2ObserverInter: Staff2ObserverImpl){
        if(!mListObserver.contains(staff2ObserverInter)){
            mListObserver.add(staff2ObserverInter)
        }
    }

    /**
     * 解绑观察者
     */

    fun unRegisterObservable(staff2ObserverInter: Staff2ObserverImpl){
        if(staff2ObserverInter != null){
            mListObserver.remove(staff2ObserverInter)
        }
    }

    /**
     * 发布消息
     */
    fun notifyMessage(msg : String){
        LogUtils.i("notifyMessage : ${mListObserver.size}, ${mListObserver}")
        mListObserver.forEachIndexed { index, staff2ObserverImpl ->
            LogUtils.e("index : ${index}, ${staff2ObserverImpl}")
            staff2ObserverImpl.publicMessage(msg)
        }
    }
}

测试调用:

/**
 * 观察者模式-自定义接口
 */
private fun processObserverCustomer(){
    var company2Observable = Company2Observable()
    var staff2ObserverImpl1 = Staff2ObserverImpl()
    var staff2ObserverImpl2 = Staff2ObserverImpl()
    var staff2ObserverImpl3 = Staff2ObserverImpl()
    company2Observable.registerObservable(staff2ObserverImpl1)
    company2Observable.registerObservable(staff2ObserverImpl2)
    company2Observable.registerObservable(staff2ObserverImpl3)
    company2Observable.notifyMessage("过年放假15天")
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐