安卓常见设计模式12------观察者模式(Kotlin版、Livedata、Flow)

1. W1 是什么,什么是观察者模式?​

  1. 观察者模式(Observer Pattern)是一种行为型设计模式,用于实现组件间的松耦合通信。
  2. 主要对象有观察者接口(Observer)和可观察对象(Observable)。

2. W2 为什么,为什么需要使用观察者模式,能给我们编码带来什么好处?​

  1. 解耦性(Decoupling):观察者模式可以降低组件之间的耦合度。观察者和被观察者之间是松散耦合的关系,它们之间只通过定义的接口进行通信。这样一来,当一个被观察者发生变化时,它并不关心具体观察者是谁以及观察者的数量和类型。同样,一个观察者也不需要关心被观察者的具体实现。这种解耦性使得代码更加灵活、可维护和可扩展。

  2. 可重用性(Reusability):通过使用观察者模式,可以将观察者和被观察者分开,使它们可以独立地进行重用。这使得我们可以在不同的上下文中重复使用同一个观察者和被观察者,而无需修改它们的实现。这提高了代码的重用性,减少了重复编写相似功能的工作量。

  3. 扩展性(Extensibility):观察者模式使得系统更易于扩展。当需要添加新的观察者或被观察者时,只需实现相应的接口即可,而无需修改现有的代码。这种扩展性使得系统能够灵活地适应变化和需求的增加,而不会影响已有的功能和模块。

  4. 即时通知(Immediate Notification):通过观察者模式,当被观察者的状态发生变化时,观察者可以立即获得通知。这样可以实现实时的数据更新和反馈,提供良好的用户体验。观察者可以根据自身的需求和逻辑对接收到的数据进行处理,例如更新UI、执行特定操作等。

  5. 多态性(Polymorphism):观察者模式利用了多态性的特性。观察者可以是不同类的实例,只要它们遵循相同的观察者接口。这种多态性使得我们可以在运行时动态地添加、删除和替换观察者,而无需修改现有的代码。这种灵活性和可扩展性使得系统更具适应性和可配置性。

3. W3,如何使用?下面是代码示例:

定义观察者接口(Observer):

interface Observer {
    fun update(data: Any)
}

定义可观察对象(Observable):

class Observable {
    private val observers: MutableList<Observer> = mutableListOf()

    fun addObserver(observer: Observer) {
        observers.add(observer)
    }

    fun removeObserver(observer: Observer) {
        observers.remove(observer)
    }

    fun notifyObservers(data: Any) {
        for (observer in observers) {
            observer.update(data)
        }
    }
}

实现观察者:

class MyObserver : Observer {
    override fun update(data: Any) {
        // 处理接收到的数据
        println("Received data: $data")
    }
}

示例代码:

fun main() {
    val observable = Observable()
    val observer1 = MyObserver()
    val observer2 = MyObserver()

    observable.addObserver(observer1)
    observable.addObserver(observer2)

    // 模拟发送数据
    observable.notifyObservers("Hello, World!")

    observable.removeObserver(observer2)

    // 再次发送数据
    observable.notifyObservers("Hi!")

    // 输出:
    // Received data: Hello, World!
    // Received data: Hello, World!
    // Received data: Hi!
}

平时开发过程中我们一般使用一些封装好了的Observer,下面是一些例子:

  1. 使用LiveData
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

object XXXXController {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data

    fun updateData(data: String) {
        _data.value = data
    }
}

fun main() {
	XXXXController.data.observe(this@XXXActivity){
	    // 处理接收到的数据
	    println("Received data: $it")
	}
}
  1. 使用Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow

object XXXXController {
    private val _data = MutableStateFlow<String>("")
    val data: StateFlow<String> = _data

    fun updateData(data: String) {
        _data.value = data
    }
}


fun main() {
	lifecycleScope.launch {
	    XXXXController.data.collect { data ->
	        // 处理接收到的数据
	        println("Received data: $data")
	    }
	}
}

Thank you for your reading, best regards!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kotlin LiveData 是用于 Android 开发的一个特性,它是一个发布-订阅模式的数据源。LiveData 允许你创建可以被观察(即订阅)的数据对象,从而让你的组件知道数据何时发生变化。这使得数据更新更加透明,并且可以轻松地将数据传递给依赖它的组件。 使用 Kotlin LiveData 的基本步骤如下: 1. 创建一个 LiveData 对象:LiveData 对象是你想要发布的数据的公共视图。你可以将任何可变的、可观察的数据(如变量、属性或对象)封装在 LiveData 对象中。 ```kotlin val liveData = MutableLiveData<Int>() ``` 2. 将数据设置为 LiveData 对象:你可以通过调用 LiveData 对象的 set 方法将数据发布出去。 ```kotlin liveData.value = 42 ``` 3. 将 LiveData 对象传递给依赖它的组件:你可以将 LiveData 对象传递给任何需要它的组件,如 ViewModel 或 Activity/Fragment。这样,当 LiveData 中的数据发生变化时,所有订阅该数据的组件都会收到通知。 4. 使用观察者更新 UI:一旦你订阅了 LiveData 对象,你就可以在 UI 中使用观察者来更新 UI。当数据发生变化时,UI 将自动更新。 LiveData 的优点包括: * 它提供了一种简单的方法来处理数据更新,使得组件之间的通信更加清晰和一致。 * 它允许你将数据传递给任何需要它的组件,而无需手动复制或传递数据。 * 它支持多线程操作,可以在异步操作中安全地更新 LiveData 对象。 需要注意的是,LiveData 是用于在后台线程中维护数据的,并且不能被外部观察者修改。因此,如果你需要修改数据并通知外部观察者,你可能需要使用其他方法,如使用 ViewModel 或其他观察者模式实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiet_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值