一、被观察者(Demo中的角色:ZhengFuObservable)
(ZhengFuObservable)政府相关政策发生改变,立即通知它的观察者。具体源码实现如下所示:
package com.study.observer
import java.util.*
class ZhengFuObservable : Observable() {
/**
* 政策更新
*/
fun policyUpdate(policy: String) {
println("政府政策改变了")
//通知改变
setChanged()
notifyObservers(policy)
}
/**
* 政策修改
*/
fun policyCancel(policy: String) {
println("政府政策取消了")
//通知改变
setChanged()
notifyObservers(policy)
}
}
二、观察者(Demo中的角色:MaYun、MaHuaTeng、LiYanHong)
相关观察者接受到通知之后,根据自身需求展开相应逻辑处理。具体源码实现如下所示:
package com.study.observer
import java.util.*
/**
* 观察者马云,如果被观察者发出通知,自己相应的处理
*/
class MaYun : Observer {
override fun update(o: Observable?, arg: Any?) {
notifyAlibabaCompany(arg.toString())
}
/**
* 通知本公司员工政策的改变
*/
fun notifyAlibabaCompany(msg: String) {
println("阿里巴巴员工::$msg")
}
}
package com.study.observer
import java.util.*
/**
* 观察者马化腾,如果被观察者发出通知,自己相应的处理
*/
class MaHuaTeng : Observer {
override fun update(o: Observable?, arg: Any?) {
notifyTencentCompany(arg.toString())
}
/**
* 通知本公司员工政策的改变
*/
fun notifyTencentCompany(msg: String) {
println("腾讯员工::$msg")
}
}
package com.study.observer
import java.util.*
/**
* 观察者李彦宏,如果被观察者发出通知,自己相应的处理
*/
class LiYanHong : Observer {
override fun update(o: Observable?, arg: Any?) {
notifyBaiDuCompany(arg.toString())
}
/**
* 通知本公司员工政策的改变
*/
fun notifyBaiDuCompany(msg: String) {
println("百度员工::$msg")
}
}
三、主程序的调用
具体源码如下所示:
package com.study.observer
/**
* 定义和类型
* 定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新;
* 为了解释一种语言,而为语言创建的解释器
* 类型:行为型
* 适用场景
* 观察行为场景,建立一套触发机制
* 优点
* 观察者和被观察者之间建立一个抽象的耦合
* 观察者模式支持广播通信
* 缺点
* 观察者之间有过多的细节依赖,提高时间消耗和程序复杂度
* 使用要得当,要避免循环调用
*/
fun main(args: Array<String>) {
var zhengfu = ZhengFuObservable()
var maYun = MaYun()
var maHuaTeng = MaHuaTeng()
var liYanHong = LiYanHong()
zhengfu.addObserver(maYun)
zhengfu.addObserver(maHuaTeng)
zhengfu.addObserver(liYanHong)
zhengfu.policyUpdate("第三方支付牌照改变了")
zhengfu.policyCancel("企业所得税取消了")
}
四、运行结果