kotlin-设计模式-观察者模式
kotlin-设计模式-观察者模式
·
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天")
}更多推荐


所有评论(0)