定义
发布订阅模式。在对象之间定义了一对多的依赖,当一个对象发生改变,依赖它的对象都会收到通知并自动更新
构成部分
-
抽象被观察角色
一个抽象主题,它把所有对观察者对象的引用保存到一个集合中,每一个主题都可以包含任意数量的观察者。抽象主题提供了一个接口,可以增加和删除观察者角色
-
具体被观察者角色
具体的主题,当内部状态改变时,会向所有的观察者发出通知
-
抽象观察者角色
为具体观察者提供接口,在接收到被观察者的通知后更新自己
-
具体观察者角色
实现观察者角色的接口
使用场景
- 微信公众号服务,不定时发布一些消息,关注公众号的就可以收到推送消息,取消关注就收不到推送消息
代码实例
抽象观察者角色
/**
* 抽象观察者角色
*/
interface AbsObserver {
fun update(data:Any)
}
具体观察者角色
import android.util.Log
/**
* 具体观察者角色
*/
class Observer : AbsObserver {
private val TAG="Observer"
/**观察者的名字*/
private var name:String=""
constructor(name: String) {
this.name = name
}
/**
* 观察者接收到被观察者的消息
*/
override fun update(data: Any) {
Log.i(TAG,"微信订阅者${name}接收到消息:"+data)
}
}
抽象被观察者角色
/**
* 抽象被观察者角色
*/
interface AbsObservable {
/**
* 添加观察者
*/
fun addObserver(observer:AbsObserver)
/**
* 移除观察者
*/
fun removeObserver(observer:AbsObserver)
/**
* 发送通知
*/
fun notify(data:String)
}
具体被观察者角色
import android.util.Log
import java.util.*
/**
* 具体观察者角色
*/
class Observable:AbsObservable {
private val TAG="Observable"
/**观察者集合*/
private val mObservers:Vector<AbsObserver> = Vector()
init {
Log.i(TAG,"微信号被创建")
}
override fun addObserver(observer: AbsObserver) {
if(!mObservers.contains(observer)){
mObservers.add(observer)
}
Log.i(TAG,"微信观众订阅了微信号:"+observer)
}
override fun removeObserver(observer: AbsObserver) {
mObservers?.remove(observer)
Log.i(TAG,"微信观众取消微信号的订阅:"+observer)
}
override fun notify(data: String) {
Log.i(TAG,"被观察者发生了该改变,发送通知给观察者:"+data)
mObservers?.forEach {
it.update(data)
}
}
}
测试代码
/**
* 观察者模式测试
*/
fun observeMode(){
//微信公众号(被观察者对象)
val server= Observable()
//订阅对象(观察者对象)
server.addObserver(Observer("张三"))
server.addObserver(Observer("王石"))
server.addObserver(Observer("张龙"))
//微信公众号发布消息
//发布的消息内容
val message="微信公众号发布消息了..."
server.notify(message)
}
打印信息
Observable: 微信号被创建
Observable: 微信观众订阅了微信号:com.mj.rxjavasample.observeMode.Observer@419b8340
Observable: 微信观众订阅了微信号:com.mj.rxjavasample.observeMode.Observer@419b8820
Observable: 微信观众订阅了微信号:com.mj.rxjavasample.observeMode.Observer@419b8b20
Observable: 被观察者发生了该改变,发送通知给观察者:微信公众号发布消息了...
Observer: 微信订阅者张三接收到消息:微信公众号发布消息了...
Observer: 微信订阅者王石接收到消息:微信公众号发布消息了...
Observer: 微信订阅者张龙接收到消息:微信公众号发布消息了...