设计模式之代理模式 Android代码分析

来源:互联网 发布:freehand 11 for mac 编辑:程序博客网 时间:2024/05/22 03:15

一,基本概念

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

0 0
原创粉丝点击