您的位置:首页 > 热点专题

Android Retrofit 源码系列(五)~ 设计模式分析

时间:2020-03-07

不久前,我研究了下层框架。我还写了一些关于改装的文章:

安卓改装源代码系列(1) ~原理分析

安卓改装源代码系列(2) ~定制CallAdapter

安卓改装源代码系列(3)~ RxJAVA集成,Coroutine分析

安卓改装源代码系列(四)~文件上传

阅读改装源代码时,仍然有很多收获,所以我提炼了一些我的想法和收获。我认为这篇文章是我的改造系列中最有价值的一篇,因为仅仅知道框架是如何完成的是不够的。我们也应该思考作者为什么这样做,以及它有什么好处。解决什么问题?只有从设计的角度去思考,我们才能提高我们的设计能力,为我们将来编写高性能、高稳定性和可扩展的代码打下良好的基础。

考虑多线程

当我们编写代码时,有多少人会考虑多线程同步?也许很多人只考虑单线程的情况。

例如,翻新:

中的代码是一个,为什么要将解析注释的操作放在同步代码块中,因为如果多个线程执行到,将会触发多个操作,并且这个操作相对比较耗时,翻新会将解析的结果放在ConcurrentHashMap集合中,以提高性能。

另一个细节是作者将在同步代码块之前放置它。这样做的好处是避免在同步之外设置另一层if(result==null),这是我们经常在网上看到的双重检查。

动态代理

动态代理技术是改造使用的最核心的技术。在使用改进的过程中,我们只需要声明接口,具体的实现类由动态代理创建。

代理模式由抽象主题角色、代理主题角色和真实主题角色组成。

在“翻新”中不从外向内传递,而是在内部动态创建。

在这种情况下,用户(客户端)很简单,只需要创建,也就是我们创建的。

翻新最大限度地使用动态代理。在调用接口方法之前,它分析方法上的注释,然后组装网络请求所需的参数,然后发送网络请求。

事实上,JDK在很多地方也使用动态代理,比如注释。本质上,注释是一个。例如,我们创建一个注释

其类字节码如下:

事实上,注释是一个继承的接口。

因为注释是一个接口,它的实现类来自哪里?我们创建了一个注释,但没有创建实现类。

例如,当我们通过反射得到注释实例时,我们没有实?终飧隼唷U飧隼邮窃趺床模渴率瞪希琂DK是由动态代理创建的。

让我们看下面一个简单的例子。我们通过反射得到方法参数的注释:

我们不能通过输出得到任何有效的信息。我们可以在遍历调试期间查看注释:

如果我们看到的前缀通常是动态代理,变量是,我们在分析动态代理的原理时已经介绍过了。“构建器模式”改造中的构建器模式也非常常用。例如,构建一个翻新对象。

事实上,当我们使用许多开源框架时,我们很少让我们直接通过构造函数来创建对象,其中许多是通过。

一般来说,构建器模式具有更好的可扩展性。将来,您可能需要添加参数。如果您在开始时使用生成器或静态工厂,您将无法控制它,直到类需要更多的参数来添加生成器模式。那些过时的建筑商或静态工厂非常不协调。因此,通常最好在开始时使用构建器模式。

我们知道当定义一个接口函数时,函数的返回类型是,例如:

翻新使用适配器模式,这使得翻新具有很好的可扩展性。

我们知道当定义一个接口函数时,函数的返回类型是,例如:

随着流行,你想用集成做什么?

作者已经考虑过这一点,并通过它实现了。

通过适配器使结果适应您需要的类型。例如,科特林协同效应在未来更受欢迎。如何整合协同效应?

我写了一个非常方便的方法来整合协调过程。后来,Reversoft直接将协调过程集成到Reversoft中,所以我们不必在

Refusion中使用CallAdapter。它非常灵活,不仅允许开发人员定制CallAdapter,还可以再次打包适配器。例如,在使用之后,我们希望定制CallAdapter,以达到统一封装网络错误处理和指定观察者要执行的线程的目的。

有关定制CallAdapter的更多信息,您可以查看:

安卓翻新源代码系列(2) ~定制CallAdapter

安卓翻新源代码系列(3)~ RxJava和Coroutine分析的集成

也使用适配器模式:

改编的目标是一次性的。回调的组合,因为后来又需要使用:

CallCallback在具体实现中是通过Call、Observer两个对象来实现的,这也是典型的适配器模式。

有关适配器模式的更多信息,请参考我之前的文章:《设计模式 ~ 适配器模式分析与实战》

Factory Mode

当我们阅读许多源代码时,我们会发现对于源代码中的一些核心组件类,作者不会直接通过或或或模式来创建对象。

例如,“翻新”中的CallAdapter是由以下人员创建的:

我们发现这是一个典型的汇总示例。

无论是哪种工厂模式,其核心原则是屏蔽对象的创建细节,客户端只负责“消费”对象,不关心对象的创建,从而达到解耦的目的。

有关工厂模式的更多信息,请参考我之前的文章:《设计模式 ~ 工厂模式剖析与实战》

Decorator Pattern

Decorator模式,也称为包装模式。装饰模式以透明的方式将对象函数扩展到客户端。装饰模式可以动态地给对象增加一些额外的责任。在添加函数方面,装饰模式比继承方式更灵活。

翻新在很多地方也使用装饰模式。例如:

上面实际上是它实现了接口和接口。

然后传递给的构造函数以获得增强的功能(指定OkHttpCall回调所在的线程)

这是典型的。

关于装饰模式的更多信息,请参考我之前的文章:《设计模式 ~ 装饰模式探究》

Summary

本文从设计模式的角度分析了相关的源代码,希望对你有所帮助。

此外,本文中涉及的代码都在我的AndroidAll GitHub存储库中。除了翻新之外,该仓库还拥有安卓程序员需要掌握的技术堆栈,例如:程序架构、设计模式、性能优化、数据结构算法、科特林、颤振、NDK、路由器、RxJava、Glide、LeakCanary、Dagger2、翻新、OkHttp、ButterKnife、路由器等。它不断更新,欢迎明星。

  • 友情链接:
  • 交口农业网 版权所有© www.imms2015.com 技术支持:交口农业网| 网站地图