• 行为型模式-观察者模式


    参考:https://www.jianshu.com/p/8f32da74cd8b

    观察者模式是设计模式中的“超级模式”,其应用随处可见。

    1.定义

    定义对象间的一种一个对多的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。

    2.介绍

    • 观察者属于行为型模式。
    • 观察者模式又被称作发布/订阅模式。
    • 观察者模式主要用来解耦,将被观察者和观察者解耦,让他们之间没有没有依赖或者依赖关系很小。

    3.UML类图

    角色说明:
    • Subject(抽象主题):又叫抽象被观察者,把所有观察者对象的引用保存到一个集合里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
    • ConcreteSubject(具体主题):又叫具体被观察者,将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
    • Observer (抽象观察者):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
    • ConcrereObserver(具体观察者):实现抽象观察者定义的更新接口,当得到主题更改通知时更新自身的状态。

    4.实现

    继续以送快递为例,快递员有时只是把快递拉到楼下,然后就通知收件人下楼去取快递。

    5. 应用场景

    • 当一个对象的改变需要通知其它对象改变时,而且它不知道具体有多少个对象有待改变时。
    • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁
    • 跨系统的消息交换场景,如消息队列、事件总线的处理机制。

    6. 优点

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

    7. 缺点

    • 依赖关系并未完全解除,抽象主题仍然依赖抽象观察者。
    • 使用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般会采用异步实现。
    • 可能会引起多余的数据通知。

    8. Android中的源码分析

    8.1 控件中Listener监听方式

    Android中我们遇到的最常用的观察者模式就是各种控件的监听

    8.2 Adapter的notifyDataSetChanged()方法

    ListView的数据发生变化时,我们调用AdapternotifyDataSetChanged()方法,这个方法又会调用所有观察者(AdapterDataSetObserver)的onChanged()方法,onChanged()方法又会调用requestLayout()方法来重新进行布局。

    8.3 BroadcastReceiver

    BroadcastReceiver作为Android的四大组件之一,实际上也是一个典型的观察者模式.通过sendBroadcast发送广播时,只有注册了相应的IntentFilterBroadcastReceiver对象才会收到这个广播信息,其onReceive方法才会被调起.

    8.4 其他

    另外,一些著名的第三方事件总线库,比如RxJava、RxAndroid、EventBus、otto等等,也是使用了观察者模式.




  • 相关阅读:
    本地邮件系统的安装及配置
    通用性站点管理后台(Bee OPOA Platform) (2) 快速开发特性
    (转).NET Framework 自动内存管理机制深入剖析 (C#分析篇)
    通用性站点管理后台(Bee OPOA Platform) (3) MVC特性
    通用性站点管理后台(Bee OPOA Platform) (4) DAL
    通用性站点管理后台(Bee OPOA Platform) (1)
    【讨论】一个接口的世界
    Ubuntu Mono 初体验
    发现assembly的dll在temp里,AppDomain无法动态加载那个assembly
    熟知android模拟器的快捷键
  • 原文地址:https://www.cnblogs.com/suiyilaile/p/10144053.html
Copyright © 2020-2023  润新知