前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代理模式二

代理模式二

作者头像
三流编程
发布2022-09-30 08:58:02
1190
发布2022-09-30 08:58:02
举报

远程代理

《Head First 设计模式》中讲,怎么毫无印象啊,再去看一遍,用 Java 内置的 RMI 举例,当年肯定是因为过于复杂难懂放弃了。现在看,第一反应是 Android 通过 AIDL 那一套的 Binder 机制,应该就是这个东西。

C/S 架构中,Client 不好直接调用 Server,Client 端有个辅助对象叫 Stub(桩),服务端有个辅助对象叫 Skeleton(骨架)。

书里大致流程应该是:

  1. Server 生成 Skeleton,Stub
  2. Server 向一个中间的桥梁 Registry 中注册绑定那个 Stub
  3. Client 从 Registry 找到对应 Stub
  4. Client 调用方法序列化后,通过 Stub 传到了 Skeleton,Skeleton 反序列化后调用 Server
  5. 返回结果再从 Skeleton 传给 Stub,进而到了 Client。

在 Android 里,创建 AIDL 文件,会自动生成一个类,这个类其实就是相当于服务端同时生成了 Stub 和 Skeleton。

内部生成子类 Stub,继承自 Binder,感觉它应该就是服务端的 Skeleton。

Stub.asInterface 方法中,当没有跨进程的时候,就是把这个 Stub 给客户端,相当于并不是什么远程调用,不需要做代理,但从架构来说,还是按需要远程调用的那一套来,这样保持统一;当需要跨进程时,返回 Stub 的代理 Proxy 给客户端,就相当于 Client 从 Registry 中查找到对应的 Stub。

代理类 Proxy 中定义了要调用的远程方法,就是将一些信息序列化通过 transact 方法传到服务端的 Stub 类,服务端在 onTransact 中接收到,反序列化,真正调用服务端的方法。返回值放到 _reply,这是一个序列化的对象,然后 Proxy 再从 _reply 把结果取出来。

当客户端 bindService 时,找到了桥梁 Binder,然后调用它的 asInterface,相当于从 Registry 中找到对应的 Stub 代理。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 远程代理
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档