热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android内核设计模式---观察者模式

观察者模式--许栋梁前言:观察者模式是经常被使用的设计模式之一,前阵子有同事问:观察者模式和回调有何区别?一种很表层的区别是,观察者模式是一种一对

观察者模式

--许栋梁

前言:

     观察者模式是经常被使用的设计模式之一,前阵子有同事问:观察者模式和回调有何区别?一种很表层的区别是,观察者模式是一种一对多的关系,而回调是一种单对单的关系。应用场合也很灵活。

正文:

 1、观察者模式模型

   观察者模式主体就两个类,被观察者、观察者,以及观察者实现的将被通知的接口。Ilistener是被观察者的内部接口。观察者继承于Ilistener这个接口,被观察者中会创建一个保存观察者的集合。基本模型图如下所示:

               

2、发布订阅者模式

 这个模式和观察者模式是一样的,不过是另外一种说法。这种模式也是两个主体,发布者和订阅者。例如Android的事件处理模型就是采用这种模式(在Android事件处理中讲解)。发布者需要发布的内容一般由外部条件触发产生。产生的内容一部分由内部消费,另一部分输出给订阅者使用。基本模型如下所示:


3、Android系统中使用的观察者模式 

 1)、Android系统中的广播机制使用的就是发布订阅者模式。

   下图描述广播机制的基本模型,其中进程1通过sendBroadcast()发送广播,充其量只不过是一个外部输入,最终还是将输入交给系统内部去处理,系统在这个过程中充当的是发布者的角色,然后将广播发送给订阅者进程2,即BroadCastReceiver观察者会通过registerBroadCastReceiver()注册到系统中,主是注册到到AMS(ActivityManagerService)中?



2)、contentProvider、contentResolver、contentObserver机制.

  这里必须说明一点的是:实际上面向观察者的是ContentResolver,当然它只是一个壳。具体的数据操作还由ContentProvider

来完成。对于观察者来说,ContentResolver是最直接的被观察对象。ContentProvider相对于用户来说是隔离的。

   

结论:

  使用设计模式可以提高代码的结构质量,便于代码的复用、维护、修改,但一定程度上也会有负面影响。

 优点:

  1)、观察者不必时时关注被观察对象的变化,可以处理自已的内部事务。

  2)、被观察对象会将数据集准备好、事件等先处理好,然后将这个变化告知观察者,其实也是在减轻观察者的负担和工作量。

  3)、观察者不必关注被观察对象如何发生变化,只需知道变化的结果就好。

 缺点:

 1)、观察者后知后觉,对变化的响应是有延后的。


   

    


推荐阅读
  • Servlet过滤器入门:实现与配置
    本文介绍如何在Java Web应用中实现和配置Servlet过滤器,通过实现`javax.servlet.Filter`接口来创建过滤器,并详细说明其在web.xml文件中的配置方法。 ... [详细]
  • 在许多地理位置选择类的应用程序中,侧边栏是常见的用户界面元素,用于通过选择特定的字母快速定位和选择地点。本文将详细介绍如何在Android应用中创建一个具有波浪效果的自定义侧边栏,以提升用户体验。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 掌握Mosek矩阵运算,轻松应对优化挑战
    本篇文章继续深入探讨Mosek学习笔记系列,特别是矩阵运算部分,这对于优化问题的解决至关重要。通过本文,您将了解到如何高效地使用Mosek进行矩阵初始化、线性代数运算及约束域的设定。 ... [详细]
  • 尾花|花萼_相关性Correlations 皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)
    尾花|花萼_相关性Correlations 皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman) ... [详细]
  • 树莓派摄像头配置与应用指南
    本文详细介绍了如何在树莓派上配置和使用摄像头,包括启用摄像头接口、简单的图片和视频捕捉方法以及如何通过网络实时传输视频流。 ... [详细]
  • 本文详细介绍了Pandas库中的DataFrame对象如何通过不同的方法(如iat, loc, iloc)来访问和操作数据元素,包括基于位置和标签的索引方式。 ... [详细]
  • 本文详细探讨了在微服务架构中,使用Feign进行远程调用时出现的请求头丢失问题,并提供了具体的解决方案。重点讨论了单线程和异步调用两种场景下的处理方法。 ... [详细]
  • 优雅实现 jQuery 折叠展开下拉菜单
    本文介绍了一种使用 jQuery 实现的优雅折叠和展开效果的下拉菜单,通过简单的 HTML 结构和 CSS 样式,结合 jQuery 脚本,可以轻松创建出美观且功能强大的下拉菜单。 ... [详细]
  • 本文探讨了如何通过图像处理技术,特别是使用C#中的PictureBox控件,来提取含有数字的特定区域。初步思路包括图像反转等步骤。 ... [详细]
  • 初探Java编程:从入门到实践
    本文旨在为初学者提供Java编程的基础知识,涵盖程序、算法、流程图的概念,以及JDK环境的配置和Eclipse的使用方法。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文探讨了在QT框架中如何有效遍历文件内容,并解决了一个常见的错误,即文件内容读取为空时弹窗无法正常显示的问题。 ... [详细]
author-avatar
把默认珀尔_430_394
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有