设计模式-通过微信公众号示例讲解观察者模式
发表时间:2020-10-2
发布人:葵宇科技
浏览次数:62
实例
微信公众号的流程:
首先看一下公众号的基础功能:
- 发布文章
- 通知所有人或者是通知部分人
- 删除关注者
- 点击关注(已关注的不能重复关注)
然后订阅公众号的读者只需订阅公众号即可
当公众号的作者发布内容选择相关的读者之后,订阅公众号的相关读者就能收到消息。
实现
- 定义抽象被观察者(微信公众号)
- 定义抽象观察者(具体的微信公众号)
- 定义具体的被观察者(读者)
- 定义具体的观察者(订阅具体微信公众号的读者)
- 观察者订阅被观察者(读者订阅公众号)
- 被观察者发送消息(公众号发送内容)
定义抽象被观察者
interface Subject {
fun addObserver(observer: Observer?)
fun removeObserver(observer: Observer?)
fun removeAll()
fun notifyObserver(observer: Observer?,data:Any)
fun notifyAll(data: Any)
}
定义抽象观察者
interface Observer {
fun update(subject: Subject, data:Any)
}
定义具体的被观察者
class SubjectOne:Subject {
private val observerList = mutableListOf<Observer>()
override fun addObserver(observer: Observer?) {
if (!observerList.contains(observer)){
observer?.let { observerList.add(it) }
}
}
override fun removeObserver(observer: Observer?) {
observerList.remove(observer)
}
override fun removeAll() {
observerList.clear()
}
override fun notifyObserver(observer: Observer?, data: Any) {
observer?.update(this,data)
}
override fun notifyAll(data: Any) {
for (observer in observerList){
observer.update(this,data)
}
}
}
定义具体的观察者
// 观察者1
class ObserverOne:Observer {
private val TAG = ObserverOne::class.java.simpleName
override fun update(subject: Subject, data: Any) {
Log.e(TAG,"接收到通知:$data")
}
}
// 观察者2
class ObserverTwo:Observer {
private val TAG = ObserverTwo::class.java.simpleName
override fun update(subject: Subject, data: Any) {
Log.e(TAG,"接收到通知:$data")
}
}
建立二者的联系
val subjectOne = SubjectOne()
val observerOne = ObserverOne()
val observerTwo = ObserverTwo()
// 订阅
subjectOne.addObserver(observerOne)
subjectOne.addObserver(observerTwo)
subjectOne.notifyObserver(observerOne,"observerOne 接收的消息")
subjectOne.notifyAll("所有的消息")
// 记得移除,防止内存泄漏
subjectOne.removeObserver(observerOne)
subjectOne.removeAll()
参考
- RxJava