代理模式是一个结构型设计模式。Proxy Pattren也叫委托模式。
定义:
为其他对象提供一种代理以控制对这个对象的访问。
场景:
当不想直接访问一个对象或者无法访问时,可以使用代理对象来访问,为了客户端使用的透明性,委托对象和代理对象要实现相同的接口。
实现:
原理很简单,就是代理类持有委托类的引用,客户端调用代理类的proxy.methodA()方法,而实际上在代理类的methodA()方法中,调用了委托类的realSubject.methodA方法。
代理分两种:1.静态代理。2.动态代理
静态代理是在编程的时候我们就决定了代理类。
动态代理是通过反射机制来在运行的时候动态的生成代理者对象。
java中为我们提供了一个便捷的动态代理接口InvocationHandler。
我们创建一个DynamicProxy实现InvocationHandler接口
需要复写invoke方法,方法里面调用 return metod.invoke(obj,args),obj是被代理的引用,是在构造函数中传入的,成员变量持有引用。
客户端这样做:
1.创建一个RealSubject real对象
2.构造动态代理:dynamicProxy = newDynamicProxy(real)
3.冬天构造代理者 IProxy proxy = (IProxy)Proxy.newProxyInstance(loader,new Class[] {IProxy.class},dynamicProxy)
其中IProxy使我们自己创建的和real对象行为相同的代理类接口。
loader是real类通过getClass.getClassLoader获取的。
Android源码中的应用
ActtivityManagerProxy代理类,它代理的是ActivityManagerNative的子类ActivityManagerService类。
ActivityManagerService类是运行在独立进程中的是系统级别的Service,我们并不能直接使用,这时候就要通过ActtivityManagerProxy来访问,这里其实是一个远程代理,是跨进程,通过Binder机制来通讯的。