观察者模式学习笔记,模拟微信公众号推送消息
观察者:用户
被观察者:微信公众号
推送消息的内容可以是第三方服务商提供的
类图如下
1. 观察者接口
interface Observer {
fun update(message: String?)
}
2. 被观察者接口
interface Observable {
fun add(observer: Observer)
fun remove(observer: Observer)
fun notifyObservers()
}
3. 具体观察者
class User:Observer {
companion object{
const val TAG = "User"
}
private var message: String ?= null
private var name: String
constructor(name: String) {
this.name = name
}
override fun update(message: String?) {
this.message = message
read()
}
private fun read(){
Log.d(TAG, "$name 收到消息: $message")
}
}
4. 具体被观察者
class WechatServer:Observable {
private var message: String ?= null
private var userList = mutableListOf<Observer>()
override fun add(observer: Observer) {
userList.add(observer)
}
override fun remove(observer: Observer) {
userList.remove(observer)
}
override fun notifyObservers() {
for (index in 0 until userList.size) {
userList[index].update(message)
}
}
fun pushMessage(message: String){
this.message = message
notifyObservers()
}
}
5. 测试
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
//...
@Test
fun runObserverTest() {
var server = WechatServer()
var Tom = User("Tom")
var Petter = User("Petter")
var Jon = User("Jon")
server.add(Tom)
server.add(Petter)
server.add(Jon)
server.pushMessage("车到站了")
}
}
6, 结果
07-19 10:20:23.847 21705 21744 D User : Tom 收到消息: 车到站了
07-19 10:20:23.847 21705 21744 D User : Petter 收到消息: 车到站了
07-19 10:20:23.847 21705 21744 D User : Jon 收到消息: 车到站了