上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分。模块划分主要依赖于第一是业务需求,具体是怎么样的业务。应用商店则包括两个业务,就是向用户展示applist,和下载app。第二是运行环境,在Android平台,有androidsdk提供socket等API支持。因此将模块大体换发了5个模块。(当然了图片加载可以额外提出,用开源组件去做,但是这里为了说明如何设计,暂不提到。还有下载也可以利用开源组件)分别是如下:

模块1 UI模块,负责展示信息和用户操作,主要类,RecommendActivity 负责数据展示和接受用户操作。RecommendInterface,负责底层数据回调。(这里只是举例,下载的就不在提及)

这三个类之间的调用关系如下:(我的viso貌似没有激活部分功能不能用只能口述了)

1 在RecommendActivity的onCreate里面初始化RecommendInterface实例RecommendBase实例。并将RecommendInterface注入到RecommendBase里面。

2 RecommendActivity随后给RecommendBase发送指令调用getPageViewData等方法请求数据。

3 当用户点击下载。gotoDownLoadApp的是时候,RecommendBase开始调用startDownloadApp。

好了UI模块的调用流程大体到这里。

模块2 调度模块。负责整体业务调度。主要的类包括如下:

巨复杂。不过我们继续理一下各个类调用的关系。

1 初始化该模块就是初始化Controller。Controller初始化ControllerDownLoadAppInfosInterface, 和ControllerBase。Controller将ControlelrDownLoadAppInfosInterface注入到ControllerBase里面。controllerBase初始化的时候初始化ControllerDownLoadAppInterface。

2 关键点,UI模块如何和调度模块交互。

     2.1   RecommendBase里面初始化Controller和ControllerUIInterface。并将RecommendInterface注入到ControlelrUiInterface里面。

    2.2   当RecommendActivity接收到用户指令时,RecommendBase接收到指令调用Controller.而当异步的结果出来时,ControllerUIInterface 调用RecommendInterface。并且由RecommendInterface 将UI界面更新给用户。(由此可见消息是从RecommendBase循环了一圈。)

3 页面数据加载。Controller接收到RecommendBase来的指令后调用ControllerBase启动加载模板和数据getViewDataByTempID。当底层获取到Temp和Data的是时候,会通知到ControlelrDownLoadAppInfosInterface, 这个接口在回调Controller。 Controller调用CreateViewData。之后会调用ControllerUIInterface调用将数据给到UI。

还有下载过程。这里就不在推演了。但是主要的是要看模块间怎么调用,也即是说怎么合理组合。

会发现,上层业务和自己的依赖接口是一套全面的完整的业务。而调度层也是完成了一套完整的业务。

第三个模块,数据解析模块,负责网络的applist数据和模板解析并组合。

关键点,如何和调度模块交互

在调度层的ControllerBase里面初始化该类DataWorkManager, 调度层有了模板和app数据后,调用setData,然后在调用getViewDataBytempId就可以或的模板数据。

也就是说,在调度层的依赖类里面,初始化自己的接口,并且根据依赖类的方法来实现业务。

但是这个是一个业务单元,不能实现整体业务。

第四个模块,网络请求模块。

关键点,如何和调度层交互。

首先在ControllerBase里面初始化NetTaskManager和NetTaskResultListener。并且ControllerDownLoadAppinfosInterface注入到NetTaskResultListener。

然后开始调用downLoadTemplateById()。异步的,结果由NetTaskResultListener反馈给ControllerDownLoadAppinfosInterface。由ControllerDownLoadAppinfosInterface来处理这个消息。

模块5 下载模块,还需要说么?我想不必了。

其实合理组合就看你在模块之间如何调度了。模块之所以提供接口,是因为第一,他的模块不需要其他模块所关心的。只要调用它的接口即可。第二,如果他的实现出现问题,问题解决也必然在这个模块里面。不会需要其他地方的修改。因此原则上无论模块如何改变,但不允许接口改变。

每个模块都有自己的依赖类,但是如果其他模块有类似的实现,则提供的接口必然和前者模块的依赖做出一个适配来实现无缝连接。上面的例子都是很简单的。基本上没有太多的需要依赖和接口之间的适配,但是实际工作中多着去了。

最后,很抱歉的说,上面的例子多有纰漏,很多地方只是说明说的很简单,很粗糙,有冗余,甚至有错。仅仅希望能有所获益。

Android 设计随便说说之简单实践(合理组合)的更多相关文章

  1. Android 设计随便说说之简单实践(模块划分)

    上篇随笔随(Android 设计随便说说)便说了一下什么是设计以及设计的原则,这里举一个简单的例子来进一步的说Android设计.我们以应用商店的设计来举例. 在设计之前,需要把握两部分内容,才能使得 ...

  2. Android 设计随便说说之简单实践(消息流动)

    在上面两篇分别说明了设计中较为简单也是很关键的实践点. 第一模块划分,它是根据每个模块所承载的业务,进行划分,是应用程序一个静态的描述. 第二合理组合,它是是将每个模块调动起来,共同实现业务,是一个准 ...

  3. Android 设计随便说说

    我曾经搞过应用程序的设计,当时只是读了半本宝典<重构...>,现在看来就这半本九阴真经,收益甚多啊 .再加上这现年工作上的印证,基本上可以拿出喷一下了.当然现在看来当年的项目设计真是很烂了 ...

  4. Android ------ 美团的Lint代码检查实践

    概述 Lint是Google提供的Android静态代码检查工具,可以扫描并发现代码中潜在的问题,提醒开发人员及早修正,提高代码质量.除了Android原生提供的几百个Lint规则,还可以开发自定义L ...

  5. android设计准则

    ------------缘由-------------------------------------------------------------------------------------- ...

  6. Xamarin.Android之引导页的简单制作

    0x01 前言 对于现在大部分的APP,第一次打开刚安装或更新安装的APP都会有几个引导界面,通常这几个引导页是告诉用户 APP有些什么功能或者修改了什么bug.新增了什么功能等等等. 下面就用Xam ...

  7. Android 自定义View (五)——实践

    前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压 ...

  8. 【转】Android设计中的.9.png

    来源:http://isux.tencent.com/android-ui-9-png.html Android设计中的.9.png 注意:当使用9.png做TextView背景时,一定要设置内容区域 ...

  9. SQL知识以及SQL语句简单实践

    综述 大家都知道SQL是结构化查询语言,是关系数据库的标准语言,是一个综合的,功能极强的同时又简洁易学的,它集级数据查询(Data Quest),数据操纵(Data Manipulation),数据定 ...

随机推荐

  1. ArcServer,ArcSDE,ArcIMS,ArcEngine

    ArcServer,ArcSDE,ArcIMS,ArcEngine是ESRI的四种产品ArcGIS Server 与 ArcIMS功能相似,是将地图发布成服务供调用的ArcSDE 是空间数据引擎,是将 ...

  2. 动态规划(区间DP):HDU 5115 Dire Wolf

    Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if not ...

  3. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1539  Solved: 665[Submit][Status][Di ...

  4. 使用pupperlabs yum repo

    http://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html

  5. 解决IE6浏览器下position:fixed固定定位问题

    像你所遇到的问题一样, IE6浏览器有太多的bug让制作网页的人头疼.这篇文章介绍的是介绍的是如何解决IE6不支持position:fixed;属性的办法.如果我们需要做某个元素始终位于浏览器的底部, ...

  6. MediaInfo源代码分析 2:API函数

    本文主要分析MediaInfo的API函数.它的API函数位于MediaInfo.h文件中的一个叫做MediaInfo的类中. 该类如下所示,部分重要的方法已经加上了注释: //MediaInfo类 ...

  7. AppiumLibrary

    Strategy Example Description identifier Click Element|identifier=my_element Matches by @id or @name ...

  8. [置顶] 第二届微软CRM交流年会

    第二届微软CRM交流会将在12月14日举行,亲们要是感兴趣可以查看下面的活动详情.Jeff也是第一次参加这类活动,作为本次活动的嘉宾我为大家带来一个挺有意思的分享主题<Dynamics CRM ...

  9. linux-centos挂载新硬盘操作

    类似的文章网上已经有很多,这里是记录重要操作的命令,精简流程 精简后的命令: fdisk -ldf -hfdisk /dev/vdbfdisk -l /dev/vdbmkfs -t ext4 /dev ...

  10. 【JAVA - SSM】之MyBatis的ParameterType的使用

    在MyBatis的Mapper.xml文件中,参数的表示方法有两种:一种是使用 "#{XXX}" 的方式表示的,另一种是使用 "${XXX}" 的方式表示的.今 ...