设计模式之代理模式 Android代码分析
2016-10-28 16:06
776 查看
一,基本概念
1,代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。所谓代理,就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
2,代理模式的组成:
Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口
Real Subject:真实主题-真实的对象,需要被代理主题引用
Proxy Subject:代理主题-因为ProxySubject引用了RealSubject,并且实现了跟RealSubject一样的接口,所以ProxySubject可以操作RealSubject,还可以提供一些附加操作,例如before & after
结构图:二,android 源码中使用简单代理的事例:
1,Android中ActivityManager的方法调用
可以去源码中看ActivityManager的方法调用如:获取运行应用进程信息public List<RunningAppProcessInfo> getRunningAppProcesses() { try { return ActivityManagerNative.getDefault().getRunningAppProcesses(); } catch (RemoteException e) { return null; } }
ActivityManager中并没有具体实现,而是通过代理ActivityManagerNative.getDefault()来实现的,来分析代理的整个实现过程:
1,Android中ActivityManager中相关类的继承关系图
通过类图可以知道ActivityManager之间继承关系,代理模式使用了双层代理,一层是你类似aidl中的调用关系:
对应角色 关系:
IActivityManager –> 定义的aidl文件生成的java文件的外围接口类–>代理中的共同抽象接口
ActivityManagerNative–>生成的Stub类–>代理中的共同抽象接口(由于要进程间通信继承啦Binder)
ActivityManagerService –>aidl中实现Stub类的service–>代理中的具体实现
ActivityManagerProxy–>生成的Proxy类–>代理类
第二层是ActivityManager类似持有ActivityManagerProxy。
2,Android中ActivityManager中类的建立过程
ActivityManagerNative.getDefault()的源码static public IActivityManager getDefault() { return gDefault.get(); } private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() { protected IActivityManager create() { IBinder b = ServiceManager.getService("activity"); if (false) { Log.v("ActivityManager", "default service binder = " + b); } IActivityManager am = asInterface(b); if (false) { Log.v("ActivityManager", "default service = " + am); } return am; } };
可以知道是通过ServiceManager.getService(“activity”)获取ActivityManagerService 的引用,安卓系统启动ActivityManagerService 服务时,会将引用添加到ServerManager中统一管理
二,动态代理实现
动态代理:在程序运行时,运用反射机制动态创建而成。
JDK动态代理中包含一个类和一个接口:InvocationHandler接口:
public interface InvocationHandler {
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}
参数说明:
Object proxy:指被代理的对象。
Method method:要调用的方法
Object[] args:方法调用时所需要的参数
可以将InvocationHandler接口的子类想象成一个代理的最终操作类,替换掉ProxySubject。
Proxy类:
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:
public static Object newProxyInstance(ClassLoader loader, Class
相关文章推荐
- Android系统设计中存在设计模式分析
- Android系统设计中的设计模式分析之一
- iOS设计模式(代码分析系列2:简单工厂模式)
- Android源码设计模式分析开源项目
- Android系统设计中的设计模式分析之一
- android应用开发设计模式之代理模式
- 设计模式之适配器-典型代码分析
- Android源码设计模式分析一期发布
- android设计模式之代理模式
- 【JAVA】设计模式之代理模式的使用分析
- Android系统设计中的设计模式分析之二
- Android系统设计中存在设计模式分析
- Android系统设计中存在设计模式分析
- 【转】Android系统设计中的设计模式分析(汇总)
- JUnit设计模式分析及简化的JUnit代码
- 用代码和UML图化解设计模式之桥接模式的深入分析
- 跟着Android学设计模式:代理(proxy)
- emule 代码 的 无责任 分析,设计模式角度
- Android系统设计中存在设计模式分析
- Android源码设计模式分析一期发布