模式使用场景
在我们开发过程中,可能会遇到一个数据经常发生变化,且在两个类中都有使用,两个类需要最新数据的场景。那么我们第一反应是建立一个公共存储区域,让两个类能够直接操作该公共数据,但这种方式未免有些不太优雅,于是我们的 观察者模式 就应运而生了
观察者模式概念
要通过实现接口的方式,实现两个类之间的数据更改通知,可以采用观察者模式。观察者模式是一种设计模式,其中一个对象(称为主题)维护它的依赖项(称为观察者)列表,并在其状态发生更改时自动通知它们。
在这种情况下,主体类将实现一个名为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遇到困难时,查询资料理解而得,以上资料仅代表个人理解和记录用,仅供参考,如有疑问和任何纰漏,欢迎评论区指出,谢谢!