您當前位置>首頁 » 新聞資(zī)訊 » 公衆号相關(guān) >
設計模式-通(tōng)過微信公衆号示例講解觀察者模式
發表時間:2020-10-2
發布人:葵宇科技
浏覽次數:50
實例
微信公衆号的流程:
首先看一下(xià)公衆号的基礎功能:
- 發布文(wén)章
- 通(tōng)知所有人或者是通(tōng)知部分人
- 删除關(guān)注者
- 點擊關(guān)注(已關(guān)注的不能重複關(guān)注)
然後訂閱公衆号的讀者隻需訂閱公衆号即可(kě)
當公衆号的作者發布内容選擇相關(guān)的讀者之後,訂閱公衆号的相關(guān)讀者就能收到消息。
實現
- 定義抽象被觀察者(微信公衆号)
- 定義抽象觀察者(具體的微信公衆号)
- 定義具體的被觀察者(讀者)
- 定義具體的觀察者(訂閱具體微信公衆号的讀者)
- 觀察者訂閱被觀察者(讀者訂閱公衆号)
- 被觀察者發送消息(公衆号發送内容)
定義抽象被觀察者
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,"接收到通(tōng)知:$data")
}
}
// 觀察者2
class ObserverTwo:Observer {
private val TAG = ObserverTwo::class.java.simpleName
override fun update(subject: Subject, data: Any) {
Log.e(TAG,"接收到通(tōng)知:$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