Android设计模式:观察者模式

观察者模式

简介:一个对象状态改变时通知其他对象。

背景

现在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中的许多控键都能设置监听者,其机制就是观察者模式。

优点

  • 解除观察者与主题之间的耦合。让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。
  • 易于扩展,对同一主题新增观察者时无需修原有代码。

缺点

  • 依赖关系并未完全解除,抽象主题仍然依赖抽象观察者。
  • 使用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂。
  • 可能会引起多余的数据通知。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容