设计模式——Kotlin实现一个简单的观察者模式

模式使用场景

在我们开发过程中,可能会遇到一个数据经常发生变化,且在两个类中都有使用,两个类需要最新数据的场景。那么我们第一反应是建立一个公共存储区域,让两个类能够直接操作该公共数据,但这种方式未免有些不太优雅,于是我们的 观察者模式 就应运而生了

观察者模式概念

要通过实现接口的方式,实现两个类之间的数据更改通知,可以采用观察者模式。观察者模式是一种设计模式,其中一个对象(称为主题)维护它的依赖项(称为观察者)列表,并在其状态发生更改时自动通知它们。
在这种情况下,主体类将实现一个名为Subject的接口,该接口定义了注册、删除和通知观察者的方法。每个观察者都将实现一个名为Observer的接口,该接口定义了接收更新通知的方法。当主题的状态更改时,它将迭代其观察者列表,并调用每个观察者的更新方法以通知它们。

代码实现

首先定义一个存有数据的类需要实现的接口Subject和观察者接口

interface Subject<T> {
    fun registerObserver(obj:Observer<T>)
    fun removeObserver(obj:Observer<T>)
    fun notifyObservers()
}

interface Observer<T>{
    fun update(data:T)
}

其次,完成实现类

class ConcreteSubject(
        private val observers:MutableList<Observer<String>> //待通知的观察者类们
    ):Subject<String> {

    //主题类持有的数据
    var data:String = "I am a good boy"
        get() = field
        set(value) {
            field = value
            notifyObservers()
        }

    override fun registerObserver(obj: Observer<String>) {
        observers.add(obj)
    }

    override fun removeObserver(obj: Observer<String>) {
        observers.remove(obj)
    }

    override fun notifyObservers() {
        //逐个通知观察者类
        for(o in observers){
            o.update(data) // if data have changed
        }
    }


}

class ConcreteObserver:Observer<String>{
    override fun update(data: String) { //得到更新后的数据
        println("yep~ I get the latest data: $data")
    }
}

测试类

fun main(){
    val subject = ConcreteSubject(ArrayList())
    val ob1 = ConcreteObserver()
    val ob2 = ConcreteObserver()

    //注册观察者
    subject.registerObserver(ob1)
    subject.registerObserver(ob2)

    //更改数据
    subject.data = "new data"
}

测试结果
在这里插入图片描述

总结

本设计模式是本人在毕设时完成Android app遇到困难时,查询资料理解而得,以上资料仅代表个人理解和记录用,仅供参考,如有疑问和任何纰漏,欢迎评论区指出,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值