观察者模式
简介:一个对象状态改变时通知其他对象。
背景
现在Jack的水果店的某种水果卖的很好,现在已经短缺,但是已经有很多客户订购了该水果,所以需要水果到店时通知这些客户。
设计实现
image.png代码实例
/**
*@Description
*@Author PC
*@QQ 1578684787
*/
interface Observer {
fun update()
}
class CustomerObserver(val name:String):Observer {
override fun update() {
println("${name}购买成功")
}
}
abstract class Attention {
//关注客户列表
var observers:MutableList<Observer> = ArrayList()
//关注客户
fun add(observer: Observer){
observers.add(observer)
}
//取消关注
fun remove(observer: Observer){
observers.remove(observer)
}
//发送通知
abstract fun notifyObservers()
}
class MangoAttention:Attention() {
override fun notifyObservers() {
//遍历观察者集合,调用每一个客户的购买方法
for (obs in observers){
obs.update()
}
}
fun perform(){
notifyObservers()
}
}
测试
class ObserverClient {
companion object{
@JvmStatic
fun main(args: Array<String>) {
val attention = MangoAttention()
attention.apply {
this.add(CustomerObserver("joker"))
this.add(CustomerObserver("rose"))
this.add(CustomerObserver("jetty"))
this.add(CustomerObserver("mark"))
}
attention.perform()
}
}
}
测试结果
image.png
应用场景
1、当一个对象的改变需要通知其他对象改变时,而且它不知道具体有多少个对象有待改变时。
2、当一个对象必须通知其他对象,而它又不能假定其他对象是谁。
3、跨系统的信息交换场景,如信息队列、事件总线的处理机制。
在Android中的应用:Android中的许多控键都能设置监听者,其机制就是观察者模式。
优点
- 解除观察者与主题之间的耦合。让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。
- 易于扩展,对同一主题新增观察者时无需修原有代码。
缺点
- 依赖关系并未完全解除,抽象主题仍然依赖抽象观察者。
- 使用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂。
- 可能会引起多余的数据通知。
网友评论