05、人人都会设计模式:代理模式--Proxy( 六 )


这下看到 Proxy 了吧「是不是有点小激动呢」,我们来分析一下
上面的图就是一个简单的 AIDL 的流程图,方便理解认为 .stub 就是远程进程,它把信息注册到中,.Stub.Proxy 就是一个代理,代理什么呢?代理远程的,远程把方法传给就完成了两个进程间通信「详细过程比这个复杂」,对于的入门介绍可以参看: 学习指南 还是非常不错的,建议看三遍以上
PS:这里再说一点,以上情况是针对和在两个进程间的通信,如果和在一个进程中,则 .Stub.Proxy 就不会调用「在同一个进程中,我自己就能调自己还代理个毛呀」,不信?以结果征服你
和同一进程和不同进程分析

通过以上配置,我们可以看到是运行在单独进程中的,我们在 .java 中的方法中 debug 跟一下看看结果
通过图我们可以看出,如果和不在同一个进程中,那么代码就会走到
调用代理的地方—.Stub.Proxy,并传递远程代理的对象
去掉中的 :=”:” 则和就在同一进程了

同理 debug 看结果
对比上面的图我们就知道了,这里的 iin 不为空,进入了if 的方法体「没有调用代理」,至此上面的结果验证完毕
关于 AIDL 远程代理就说到这里了,如果对想要深入了解,可以自行回去研究「这不在本节的范围内」
WTF 一个 AIDL 说了这么大半天,希望大家不要晕「我都有点晕了」
源码地址:看 proxy/aidl 这部分
三、 源码中的代理模式
其实通过上面的 AIDL 实验,我们就可以知道使用的就是远程代理模式,中的源码使用非常多,我就不一一分析了「说的太多人会受不鸟」,感兴趣的朋友可以自行分析,我这里贴出一张图,大家可以看
我们看看应用程序框架层的对应田系统层的它们之间通过使用 AIDL 来进行跨进程通信,有兴趣可以扒扒这部分的源码看一下
四、代理模式的优缺点
优点
缺点
到此为止,我们把代理模式就说完了,由于这篇篇幅比较大,源码也没有给大家分析「希望大家自行去看看,希望你有一种哦~原来是这样的赶脚」,其它的虚拟代理,缓存代理大家有兴趣也可以试试
参考资料
以后文章会第一时间发在公号,请大家添加博文的公号,扫描添加即可关注