1.代理模式
为其他对象提供一种代理,以控制这个对象的访问
某些情况下,一个客户不想或不能直接饮用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
2.代理模式涉及的角色:
抽象角色:声明真实对象和代理对象的共同接口
代理角色: 代理对象角色内部含有对真实对象的引用,从而可以操作真实对象
代理对象提供与真实对象相同的接口,以便在审核时刻都能代替真实对象
代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
对于租房子的例子:代理角色是中介、真实角色是房主(中介和房主都可以完成“租房子”的事情)
3.代理模式实现
定义真实角色 和 代理角色的抽象类(或接口)
定义真实角色——继承抽象类(或实现接口)
定义代理角色**
测试类
输出:
4.上面代码中,真实角色必须事先存在,并将其作为代理对象的内部属性,这样在实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀。
此时需要使用java的动态代理类来解决。
5.动态代理类位于java.lang.reflect包下,主要涉及两个类:
(1)Interface InvocationHandler:该接口只有一个方法:
public object invoke(Object obj,Method method,Object[] args)
(2)Proxy:三个方法
protected Proxy(InvocationHandler h)
static class getProxyClass(ClassLoader loader,class[] interface)
static Object newProxyInstance(ClassLoader loader,class[] interface,Invocation Handler)
在使用动态代理类时,必须实现InvocationHandler接口
使用动态代理,就要有InvocationHandler!每一个代理实例,就有与之关联的InvocationHandler。
真正的调用在invoke方法里完成
6.动态代理步骤
(1)创建一个实现接口InvocationHandler的类,他必须事先invoke方法
(2)创建被代理的类以及接口
(3)通过Proxy的静态方法:newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h)创建一个代理
(4)通过代理 调用方法
定义接口
定义真实角色
定义代理角色
客户端
7.例3:Foo.java,FooImpl.java,FooImpl2.java,CommonInvocationHandler.java,Demo.java
一个Foo接口有两个实现类:FooImpl和FooImpl2
定义抽象角色
定义第一个实现类,真实角色1
定义第二个实现类,真实角色2
定义代理角色
定义 客户端