Clean

特点:“洋葱结构”,内层对外层无依赖,不能了解外层结构和业务逻辑,以保证模块的独立性。
- Entities:是指一款应用的业务对象
- Use cases:是指结合数据流和实体中的用例,也称为Interactor
- Interface Adapters: 这一组适配器,是负责以最合理的格式转换用例(use cases)和实体(entities)之间的数据,表现层(Presenters )和控制层(Controllers ),就属于这一块的。
- Frameworks and Drivers: 这里是所有具体的实现了:比如:UI,工具类,基础框架,等等。
架构的实现方法

表现层 (Presentation Layer)
MVP架构图

View
负责刷新渲染UI,处理建的UI逻辑
fragment和Activity都属于View层
Presenter(主导器)
负责逻辑的处理,持有Model和View实例对象
Model
数据源,可能来自云端,本地存储,内存等等
MVP执行流程
View 调用Presenter ,Presenter调用Model获取数据,Presenter取到数据后刷新View,Presenter中处理业务逻辑,比如表单校验,非空检验,错误判断等等,Model层和View层不打交道
领域层 (Domain Layer)

包含业务对象
仓库接口
UseCase
这里定义的基本上都是接口。这里是很纯粹的Java代码
数据层 (Data Layer)

数据层,可以理解为domain层的实现
Repository(资源库)模式
让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。
Repository模式实际用途:更换、升级ORM引擎更换网络框架,不影响业务逻辑
数据可能来源于本地sdcard,内存,云端。
函数调用链

问题来了.p层调用的是usecase属于domain层,domain层都是接口
接口的实现类是在data中而domain并没有直接调用data中的实现类
domain中如何绑定data中的Repository实现类呢?
Usecase依赖关系
Repository数据源,最终依赖的还是RepositoryImpl
Executor 线程池 (执行任务线程)
PostExecutionThread 调度器(回调线程这里是主线程)
这里实现方式可以通过引用data层创建实例对象
缺点耦合性增强了,domain直接应用了data
Dagger2
这里我们使用的是dagger2进行依赖注入
通过dagger2注入usecase需要的实例对象。
实现domain层代码和data层分离
网友评论