【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
1 观察者模式结构图
2 观察者模式结构实现
/**
* 观察者模式
* @author Wenwu 2019/12/11
*/
/**
* 抽象观察者
* @author Wenwu 2019/12/11
*/
interface Observer{
/**
* 观察者名称
* @author Wenwu 2019/12/11
*/
val observerName: String
/**
* 当主体状态改变时,更新通知
* @param msg 通知消息
* @author Wenwu 2019/12/11
*/
fun update(msg: String)
}
/**
* 抽象主题(抽象被观察者)
* 定义主题行为
* @author Wenwu 2019/12/11
*/
interface Subject {
// 观察者们
val observers: MutableList<Observer>
// 通知观察者的消息
var msg: String
// 添加观察者
fun addObserver(o: Observer) {
if (!observers.contains(o)) observers.add(o)
}
// 删除观察者
fun deleteObserver(o: Observer) {
if (observers.contains(o)) observers.remove(o)
}
// 通知观察者
fun notifyObserver() {
observers.forEach{
it.update(msg)
}
}
}
/**
* 具体的观察者
* @author Wenwu 2019/12/11
*/
class ConcreteObserver(override val observerName: String): Observer {
override fun update(msg: String) {
println(msg)
}
}
/**
* 具体主题(具体被观察者)
* @author Wenwu 2019/12/11
*/
class ConcreteSubject: Subject {
/**
* 初始化观察者们对象
* @author Wenwu 2019/12/11
*/
override val observers = mutableListOf<Observer>()
override var msg: String = ""
override fun notifyObserver() {
observers.forEach{
it.update("hello, ${it.observerName}!")
}
}
/**
* 一个具体的行为
* @author Wenwu 2019/12/11
*/
fun say() {
notifyObserver()
}
}
fun main(args: Array<String>) {
// 生成三个观察者
val observerA = ConcreteObserver("观察者 A")
val observerB = ConcreteObserver("观察者 B")
val observerC = ConcreteObserver("观察者 C")
// 生成一个主题
val subjectA = ConcreteSubject()
// 添加观察者
subjectA.addObserver(observerA)
subjectA.addObserver(observerB)
subjectA.addObserver(observerC)
// 调用say,同时通知观察者
subjectA.say()
}
来源:oschina
链接:https://my.oschina.net/u/3797721/blog/3142247