- 作用:
为其他对象提供一种代理可以控制对这个对象的访问。
在某些情况下,一些客户不想或者不能直接饮用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
tips1: 代理主题操作真是主题,只是主题执行具体的业务操作,而代理主题负责其他相关业务的处理。
- 涉及到的角色:
抽象角色: 声明真实对象和代理对象的共同接口。
代理角色: 代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时 代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象,同时,代理对象可以在执行真实对象操作时, 附加其他的操作,相当于对真实对象的封装。
真实角色: 代理角色所代表的真实对象,是我们最终要引用的对象。
- 动态代理:
InvocationHandler接口: 仅仅定义了一个方法: invoke(Object obj, Method method, Object[] args)
在实际使用时,第一个参数obj一般指的是代理类,method是被代理的方法。
Proxy : 动态代理类。
优点:
被代理对象RealSubject可以在运行时动态改变,需要控制的接口Subject也可以在运行时改变,控制的方式DynamicProxySubject也可以动态改变。
- 创建步骤:
创建 实现接口InvocationHandler的类,必须实现invoke方法。(有个Object的private成员变量,以及public的构造方法,Object作为参数进行初始化)
创建 被代理的类及接口。
通过Proxy的静态方法 newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个代理。
通过代理调用方法。
Git proxy code
Git dynamic proxy code