好像相对于上面那张图更好理解,知道为什么吗?因为字少了好多。哈哈。接下来的内容以及我的开源项目中都是以此为基础来写的。分别来解释下。

表现层 (Presentation Layer)

我们这里的表现层以MVP为基础,个人觉得Clean本身也是MVP的基础上更加抽象,更加独立。熟悉的MVP的同学非常清楚这一层是干嘛用的。老规矩,先上张图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e4exjVTX-1631769638694)(https://user-gold-cdn.xitu.io/2017/9/27/ccccf90377a0baa49d63141cdd1a487f?imageView2/0/w/1280/h/960/ignore-error/1)]

是不是很眼熟?P层使得V层(Fragment和Activity)内部除UI逻辑再无其它逻辑。而我的开源项目中的Presenter由多个Interactor组成。底下会介绍。

领域层 (Domain Layer)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tfzj2mCT-1631769638696)(https://user-gold-cdn.xitu.io/2017/9/27/1950f115073f471ca4b9beb4bc4f88cc?imageView2/0/w/1280/h/960/ignore-error/1)]

图上很明显了,这里主要是interactor的实现类和业务对象。讲道理这里应该只属于java模块,但是有时候我们的业务对象,可能要实现第三方库中的实体类接口,不得不改为Android模块,暂时没想到很好的办法,有知道的大佬可以指教一下。

数据层 (Data Layer)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGrNcV00-1631769638697)(https://user-gold-cdn.xitu.io/2017/9/27/797ee7d22b857162e258f0432d996c08?imageView2/0/w/1280/h/960/ignore-error/1)]

这是一种Repository模式,具体的可以看[这里](

)。以我现在的见解,只能说只要项目复杂而需要分层,那么就应该用这个模式,它让clean架构的clean更加亮眼。

这个本来就是概念,我相信大家也不愿意看,所以就简单介绍。如果想详细了解,可以戳[这里](

)。

总结

现在谈谈自己的看法,后者是相对前者较为具体的一种符合Android的结构。在这插一个clean架构的依赖性规则:内层不能依赖外层。三者也都分别解释了是干什么用的,那么为什么有分为这三者,它们又有什么联系?我是个俗人,那就应该用俗话来讲,从数据层利用Repository模式让领域层感觉不到数据访问层的存在,即原始数据是独立的,业务规则不绑定具体哪一种数据,通俗点讲就是你要什么数据?我给你取,但你不需要知道我从哪里取的;因此领域层对数据层怎么实现的是一无所知,而领域层主要工作就是你给了我数据,那我就要用,怎么用?都是我来决定;用完之后再回调给表现层渲染UI。因此大多数的业务逻辑都在领域层,可以说是一个APP的核心。我认为这里透露着一个很重要的设计理念就是数据驱动UI,我都想给自己点个赞,哈哈。其实,到这里,你心里已经有点13数的话,可以跳到Why,因为怎么用已经是具体的东西,而架构本身就是一种共识,是抽象的,从Java角度讲你可以多个类去实现这个接口。下面的使用只是我对Clean架构理解的一点代码体现。

How

下面的例子是从我开源库[CrazyDaily](

)中选取的,以知乎日报为例。

数据层 (Data Layer)

数据层就是从我们的仓库(Repository)中取数据,可以从云端、磁盘或者内存中取。

public interface ZhihuService {String HOST = "http://news-at.zhihu.com/api/4/";@GET("news/latest")Flowable<ZhihuNewsEntity> getZhihuNewsList();@GET("news/{id}")Flowable<ZhihuNewsDetailEntity> getZhihuNewsDetail(@Path("id") long id);
}public class ZhihuDataRepository implements ZhihuRepository {...@Injectpublic ZhihuDataRepository(HttpHelper httpHelper) {mZhihuService = httpHelper.getZhihuService();}@Overridepublic Flowable<ZhihuNewsEntity> getZhihuNewsList() {return mZhihuService.getZhihuNewsList()...}...
}

这里比较尴尬的是只提供了云端的数据,采用的是retrofit+okhttp的框架获取。比较正确的方式应该是给ZhihuDataRepository提供一个Factory而不是HttpHelper,Factory根据不同的条件获取相应的数据。比如像这样:

 @InjectUserDataRepository(UserDataStoreFactory dataStoreFactory,UserEntityDataMapper userEntityDataMapper) {this.userDataStoreFactory = dataStoreFactory;this.userEntityDataMapper = userEntityDataMapper;}

UserDataStoreFactory是从不同地方获取数据的一个工厂类,UserEntityDataMapper是我们的数据包装类,不知道还记得上面的Interface Adapters吗?细心的朋友可以关注到ZhihuDataRepository实现了ZhihuRepository,但是ZhihuRepository并非数据层的东西,而是领域层的东西,很显然,以接口进行关联,但内容独立,没错,这就是传说中的依赖倒置原则。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJbjSqEL-1631769638699)(https://user-gold-cdn.xitu.io/2017/9/27/f6374b51c60eeaf235aea664d94309b3?imageView2/0/w/1280/h/960/ignore-error/1)]

领域层 (Domain Layer)

public interface ZhihuRepository {Flowable<ZhihuNewsEntity> getZhihuNewsList();Flowable<ZhihuNewsDetailEntity> getZhihuNewsDetail(long id);
}public abstract class UseCase<T, Params> {...public UseCase() {...}protected abstract Flowable<T> buildUseCaseObservable(Params params);public void execute(Params params, DisposableSubscriber<T> subscriber) {...}...
}public class ZhihuNewsListUseCase extends UseCase<ZhihuNewsEntity, Void> {private final ZhihuRepository mZhihuRepository;@Injectpublic ZhihuNewsListUseCase(ZhihuRepository zhihuRepository) {mZhihuRepository = zhihuRepository;}@Overrideprotected Flowable<ZhihuNewsEntity> buildUseCaseObservable(Void aVoid) {return mZhihuRepository.getZhihuNewsList()...}
}

真的很完美,跟数据层一毛线关系都没有,利用接口(ZhihuRepository)来控制数据层(ZhihuDataRepository)。真的感觉架构越来越有意思了。我可以在这里处理我们大部分的业务逻辑。

表现层 (Presentation Layer)

@ActivityScope
public class HomePresenter extends BasePresenter<HomeContract.View> implements HomeContract.Presenter {private ZhihuNewsListUseCase mZhihuUseCase;...@Inject //多个UseCasepublic HomePresenter(ZhihuNewsListUseCase zhihuUseCase ...) {mZhihuUseCase = zhihuUseCase;...}@Overridepublic void getZhihuNewsList() {mZhihuUseCase.execute(new BaseSubscriber<ZhihuNewsEntity>() {@Overridepublic void onNext(ZhihuNewsEntity zhihuNewsEntity) {mView.showZhihu(zhihuNewsEntity);}});}
}public interface HomeContract {interface View extends IView {void showZhihu(ZhihuNewsEntity zhihuNewsEntity);...}interface Presenter extends IPresenter<View> {void getZhihuNewsList();...
}### 文末对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]()****进阶学习视频**![](https://img-blog.csdnimg.cn/img_convert/4f1488144bf0e4b377a004e20d7afd84.png)**附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题** (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)![](https://img-blog.csdnimg.cn/img_convert/4751e4d1c7abe41f7e66927ee4fbee1c.png)*附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题** (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)[外链图片转存中...(img-KJbjb1Ud-1631769638702)]

带你领略Clean架构的魅力,腾讯T3大佬亲自讲解相关推荐

  1. 盛世昊通带你领略四驱MPV的魅力

    如果说以前车友们买车更多看性价比,现如今的消费者购车选择则更倾向于高颜值高性能.现代人的生活条件不断提升,对汽车的硬件和软性要求也越来越高.盛世昊通作为一家完成数字化转型的汽车行业产业链平台,以客户需 ...

  2. 带你领略3D转换的魅力~

    文章目录 一.什么是3D? 二.3D转换的常用属性 1.3D位移:translate3d(x,y,z) 2.3D旋转:rotate3d(x,y,z) 3.透视:perspective 4.3D呈现:t ...

  3. 火星电竞:如何用最快的速度带你领略电竞的魅力

    火星电竞APP是一个集英雄联盟,王者荣耀,DOTA2,CSGO等游戏相关资讯以及体育相关资讯的综合服务APP 1.电竞八卦,赛事资讯.赛事分析,TOP时刻等于游戏相关的一切讯息,并不是一个枯燥无味的赛 ...

  4. 探索未来的元宇宙虚拟博物馆,领略数字时代的文化魅力

    随着数字技术的飞速发展,人们的生活方式正在发生翻天覆地的变化.而元宇宙,作为一种全新的数字世界,已经吸引了越来越多人的关注.在这个虚拟的世界里,人们可以探索未来,感受科技的魅力.而今天,我们要向大家介 ...

  5. BATJ大数据架构师带你领略实时计算框架Flink的魅力!

    你是不是经常体验或看到以下这些场景? "小张,你看能不能做个监控大屏实时查看促销活动销售额(GMV)?" "小王,我们现在搞促销活动能不能实时统计销量 Top3 啊?&q ...

  6. 带你领略Android Jetpack组件的魅力

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  7. 这5部不容错过的超高评价纪录片,带你领略地球的魅力!

    全世界只有3.14 % 的人关注了 爆炸吧知识 地球是茫茫宇宙星系中唯一生机勃勃万物生存的星球,它是瞬息万变.充满自然奇观的世界.50多亿年来,地球在日复一日.沧海桑田地变化着.今天就给大家带来最顶尖 ...

  8. android clean 框架,clean架构

    1.clean架构简介 clean架构相信大家早有耳闻,毕竟是Bob大叔的心血之作,最近又把http://five.agency/blog/android/ 几篇关于clean 架构的文章拿出来读读加 ...

  9. 风云编程python-动态排名可视化 | 带你领略编程语言20年风云变化

    原标题:动态排名可视化 | 带你领略编程语言20年风云变化 作者 | 周萝卜 来源 | 萝卜大杂烩 2019已经过去,回看编程语言20年真是风云变化! 从 TIOBE 榜(热门榜)上来看,Java.C ...

最新文章

  1. R语言ggplot2可视化自定义图例(legend)方框(box):所有图例没有方框、每个图例分别在不同的方框中、多个图例放置在同一个方框中
  2. 2020 我的C++学习之路 C++PrimerPlus第九章课后习题
  3. oracle10g-创建表空间 用户
  4. python实现邮件发送功能
  5. 编译GDAL使用最新的HDF库配置文件
  6. 协议(protocol)与网络协议
  7. C++ STL 函数partial_sum的正确使用方法
  8. 10个常用的python可视化工具
  9. 【Docker】Docker下载与安装
  10. prewitt算子实现
  11. ubuntu phpmyadmin php5.3,ubuntu中怎么下载安装phpmyadmin
  12. Android怎么制作圆角矩形,如何在Android UI中绘制圆角矩形?
  13. word取消英文首字母自动大写问题
  14. php人人商城定时任务,人人商城异步操作菜单示例
  15. ink css,CSS text-decoration-skip-ink属性用法及代码示例
  16. 最受欢迎的中国 50 技术博客评选结果
  17. 中国移动--九天毕昇平台使用测试(薅Telsa V100)
  18. 2022 IDEA大会引领科技创新趋势 沈向洋团队重磅发布低空经济白皮书
  19. 5G核心网技术基础自学系列 | 消息业务
  20. 乱花渐欲迷人眼的C编译器中,谁才是“编译之王”?

热门文章

  1. 冒志鸿:没有对比就没有伤害,原来中国的区块链这么……
  2. 哪里有模板建站配云服务器销售,模板建站配云服务器费用
  3. 进一步认识Deepchem的分子特征化: 将化学分子结构作为到随机森林\CNN\RNN\GNN等机器学习模型输入的三种方法
  4. 比较工具导出html比较结果,使用Beyond Compare如何生成文件比较报告
  5. 触动精灵 python_触动精灵远程Log模块
  6. RabbitMQ的安装
  7. jfinal调用mysql存储过程 封装_jfinal 调用存储过程
  8. Android百度地图POI检索无标记显示问题
  9. Shell替换数组元素之间的间隔符号
  10. Module containing this breakpoint has not yet loaded or the breakpoint adress could not be obtained.