常见的模块化实现方式有两种
业务Module都放到同一个工程里。每个业务Module都是一个独立的工程。
如:
模块的划分
模块可分为多种类型,一般分为:三方的基础SDK;自己平台的通用功能;业务模块的拆分。
模块间通信
虽然功能已经按模块拆分,但是模块间通信也是多种形势,如果处理不好模块之间耦合严重维护成本增大。常见模块问通信有:直接依赖、事件或广播通信、路由通信、面向接口通信,下面就对比下几种通信优势。
实现方案
直接依赖
这种方式实现简单,但是耦合太严重,不方便维护与开发,当工程逐渐增大模块逐渐增多,依赖关系会非常复杂,不推荐这种方式。
事件或广播通信
EventBus:我们非常熟悉的事件总线型的通信框架,非常灵活,采用注解方式实现,但是难以追溯事件。广播:安卓的四大组件之在一个模块中发送广播设置数据,在另一个模块中注册广播接收数据,使用广播进行数据传递方式广播相对于其他的方式而言消耗资源较多。
总结:BroadcastReceiver、EventBus,非常灵活,模块之间没有任何的耦合,但是代码的可读性差,难以追溯事件,不是很推荐。
路由通信
模块与模块之间不存在依赖关系,而是各自运作,简单的来说就是映射关系的路由通信,也是目前比较主流的一种方案,比较常用的开源框架是阿里的ARouter。
ARouter典型应用
从外部URL映射到内部页面,以及参数传递与解析跨模块页面跳转,模块间解耦拦截跳转过程处理登陆、埋点等逻辑跨模块API调用,通过控制反转来做组件解耦。
面向接口通信
以上几种方式只是简单的介绍,下面就具体说下通过接口解耦通信的方式,首先先看几个问题。
什么是面向接口编程?
接口大家都很熟悉,这里所说的面向接口编程,并不只是所谓的java中的interface,而是指超类型,可以是接口也可以是抽象类。
面向接口比面向对象编程是更先进一步编程思想,而是附属于面向对象编程的体系,属于其中一部分,它是面向对象编程体系中的思想精髓之面向接口编程它的核心思想是将抽象与实现分离,从组件的级别来设计代码,达到高内聚低耦合的目的。面向接口编程方法是,先定义底层接口模块,也就是通信的协议与功能约定,是提供方实现对应的功能与能力。在架构中层次分明,不需要关注具体实现,开发中可以通过接口快速制定协议,与提供能力api,对于上层通过接口显露能力,对于下层只需要依赖接口层相当于依赖api。
面向接口编程的好处?
灵活性高没有依赖具体的实体,实现层可以任意的更改与切换。在模块化中可以相互依赖service(接口层)或依赖多个。
在模块化中的使用下面对于接口或api层统称为service,其含义为服务提供者。
对于,每一个module都一个独立的工程结构,每个module都有自己的Service,来统一暴露当前module所拥有能力与向外提供的服务。
对于module是在同一个工程里的项目结构,service可以放到统一的一个Module下,我们统称为Mediator,这样做的目的是为了减少Module创建与维护。假设你的工程有20个业务Module如果都同时增加一个service层就会造成Module数量翻一倍。由于这里存入的都一些接口类,也是每个业务Module向外提供的服务其体量不会太大,这里并只是一个建议并没有标准的做法。
当然也有更复杂的设计,一个Module又分不同的service实现如,这里不在展开细说。
实际工程中使用与设计
在实际项目中有很多项目都同时开发两版本Pad与Phone,有的是两独立的工程,有的是在同一个工程内用flavor切换不同的工程,下面我就以通过flavor切换的工程结构举例。先看下工程的包的结构:
可以看到module结构是分为三个部分,common,pad,phone,如果每个service都独立将增加3倍的Module数量。
使用一个MediatorModule统一管理这这些service就很好控制了module数量。
Service创建
在module_mediator业务module下common,pad、pone下分别创建ICommonService,IService(pa,IService(phon。ICommonService:公共服务。IService(pa:pad服务并继承CommonService。IService(phon:phone服务并继承CommonService。
注:这里为什么不用,PadService与PhoneService,是因为pad与phone版本同时只会存在一个,使用方只需要关心你提供的Service不用在区分版本,而且这里是一个继承关系也可以获取到共用的部分。
Service实现
在业务commonpadphonemodule下分别实现,ICommonService,Service(pa,IService(phon,在commonmodule创建CommonServiceImpl实现ICommonService,在pad、phonemodule分别创建ServiceImpl对应实现IService并继承与CommonServiceImpl。
Service注册
注册的方式有一般是通过代码用去注册,或通过注解进行注册。可以在Application注册也可以在业务Module下自己注册,如果使用注解则可以自动注册,具体要看项目怎样实现。例:
解释下MediatorServiceFacator,它只是一个服务工厂也是一个接口类,作用是负责管理各业务方的Servi
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】完整内容开源分享
ce主要功能是注册与获取Service。上面的代码就是往里注册了一个会员的Service。
可以看出这个函数只有两个参数,一个是接口class一个是实现类class,第一个参数cls:它会作为key来使用,第二个参数implClass:它会作为value来使用。
Service使用
通过MediatorServiceFacator懒加载获取service对象,如果业务方没有注册则获取一个空的对象。
注册有service没有使用时是不会创建的,如果使用过则会缓存下来,下次调用则直接返回。例:通过MediatorServiceFacator懒加载获取service对象,如果业务方没有注册则获取一个空的对象。
注册有service没有使用时是不会创建的,如果使用过则会缓存下来,下次调用则直接返回。例:
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点