Java代理模式与Android的情结
版权声明:本文为博主原创文章,未经博主允许不得转载
前言
Java
代理模式在 Android
中有很多的应用。比如 Android
中 Binder
的 Client
部分就是通过代理模式来访问 Server
端的、代理 Activity
或 Fragment
模式、还有很多开源框架也都使用了代理模式 (主要是动态代理)。
概念
简单地说,代理模式就是代理对象为其他真实对象 (也叫被代理对象) 提供代理机制,以便控制对真实对象的访问。此时,如果真实对象不想直接和客户端接触,则可让代理对象充当真实对象与客户端之间的中介来联系二者,完成事务联系。
抽象地说,代理对象和被代理对象一般实现相同的接口,调用者与代理对象进行交互。代理的存在对于调用者来说是透明的,调用者看到的只是接口。代理对象则可以封装一些内部的处理逻辑,如访问控制、远程通信、日志、缓存等。比如一个对象访问代理就可以在普通的访问机制之上添加缓存的支持
举个简单的例子,比如中国移动 (真实对象) 和用户 (客户端) 之间的这种业务关系。首先,我们老百姓不可能直接和中国移动总部接触,因而中国移动会将业务的操作权下放到各个省市乡的代理点 ( 代理对象),而用户到代理店办的业务其实就是总部的业务,这样一来便可大大地扩大业务,也能更方便服务用户。
代理模式的分类
静态代理
UML类图
注:图中 SM 表示
ServerManager
,其在 Android
中是联系这四大组件的关键。
首先,Server
必须先注册到 SM 中,才能够有机会和 Client
通信,然后 Client
发起请求想要调用 Server
中的方法 add()
,然而 Client
与 Server
处在不同的进程当中。如果没有媒介binder
驱动的帮助,进程间就无法完成通信。因此,透过 binder
的作用,Server
可以给 Client
下发一个代理对象,以便能够调用 Server
中的方法。这样以来,Client
就无法知道 Server
的逻辑,而只能调用被 Server
代理出去的方法 add()
。这一通信过程,便是跨进程通信。
总结
Java
代理模式的应用还是相当广泛的。对于静态代理模式,我们可以用它来代理 Activity
或者 Fragment
的生命周期方法,定义一个不注册的 ActivityDelegate
或者 FragmentDelegate
,这个可能会是比较特别的高级技巧。对于动态代理,涉及到的大多是第三方框架,其中思想很多包含有动态代理。
感谢
Java设计模式之代理模式(Proxy)
JAVA 代理模式(Proxy)
代理模式和Java中的动态代理机制
写给Android App开发人员看的Android底层知识