设计模式之:观察者模式(kotlin)
·
背景:
古人云:知己知彼,百战不殆。打仗,靠的是信息,古时候是斥候,现如今叫侦查兵,也就是拿到敌人的动向,才好排兵布阵,不然一不小心被偷袭,那可能面临着全军覆没的风险。所以,掌握信息,才能打好准备之仗。
故事:

1号斥候:报……敌方正在埋锅造饭。
我方:修整,造饭
2号斥候:报……敌方正在集结。
我方:再探,集结,排兵布阵
3号斥候:报……敌方正在睡觉
我方:再探,全速前进,全军出击,偷袭。
4号斥候:报……敌方正在训练。
我方:没事了,大家睡觉吧
5号斥候……
分解:
所以,要获取信息的前提是我方派出了一堆斥候消息打探,地形侦查等,那斥候在观察到地方有所动作后迅速返回,将得到的消息反馈给我方后,我方做出相应的动作,在此情景中,观察者为斥候,被观察的对象为敌方。
代码:
观察者:
interface MyObserver {
fun update(content:String)
}
class ChiHou : MyObserver {
override fun update(content: String) {
println("报:地方有活动……")
reportToCommander(content)
println("汇报完毕!")
}
private fun reportToCommander(reportContent: String) {
println("领导:敌方有活动 $reportContent")
}
}
被观察者:
open class MyObservable {
var observerList : MutableList<MyObserver> = mutableListOf()
fun addObserver(observer: MyObserver) {
observerList.add(observer)
}
fun deleteObserver(observer: MyObserver) {
observerList.remove(observer)
}
fun notifyObservers(content: String) {
for (observer in observerList){
observer.update(content)
}
}
}
class DiFang : MyObservable() {
fun haveBreakfast() {
println("敌方:我正在埋锅造饭……")
notifyObservers("韩非子在吃饭")
}
fun funning() {
println("敌方:我正在娱乐……")
notifyObservers("敌方在娱乐")
}
}
运行:
object Client {
@Throws(InterruptedException::class)
@JvmStatic
fun main(args: Array<String>) {
val diFang = DiFang()
val chihou1 = ChiHou()
val chihou2 = ChiHou()
val chihou3 = ChiHou()
diFang.addObserver(chihou1)
diFang.addObserver(chihou2)
diFang.addObserver(chihou3)
Thread.sleep(1000)
chihou1.haveBreakfast()
Thread.sleep(1000)
chihou1.funning()
}
}
上述只是简单实现,详情请参考Java中java.util.Observable和java.util.Observ实现机制。
更多推荐



所有评论(0)