#笔记#圣思园 JavaSE 第66讲——静态 、 动态 代理模式

来源:互联网 发布:淘宝护肤品店铺排行 编辑:程序博客网 时间:2024/06/04 18:22

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

定义代理角色

定义 客户端


0 0
原创粉丝点击