java代理模式
2012-03-01 16:11 党飞 阅读(220) 评论(0) 收藏 举报---------------------- android培训、java培训、期待与您交流! ----------------------
java代理模式有两种实现:静态代理和动态代理。
代理模式涉及三个概念:委托(者)、代理(者)和主题接口。
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时 刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
一、静态代理
静态代理要求:代理类和被代理类都必须实现同一个接口,在代理类中实现事务操作等横切业务逻辑,被代理类中只保留核心业务逻辑。
缺点:当方法很多时,势必要为每个方法都要进行代理操作,导致增加了代码的复杂度,所以静态代理不能胜任方法较多的情况。
1.先定义一个接口类
package com.zlc.proxy;
//接口类
public interface HelloWorld{
public void print();
}
2.定义一个该接口的实现类
package com.zlc.proxy;
//接口的实现类
public class HelloWorld Implimplements HelloWorld{
@Override
public void print(){
System.out.println("hello world");
}
}
3.定义一个静态代理类
package com.zlc.proxy;
//静态代理类
public class StaticProxy implements HelloWorld{
public HelloWorld helloworld;
public StaticProxy(HelloWorld helloworld){
super();
this.helloworld = helloworld;
}
@Override
public void print(){
System.out.println("Welcome");
//相当于回调
helloworld.print();
}
}
4.一个测试类
package com.zlc.proxy;
public classTestStaticProxy{
public static void main(String[] args){
HelloWorld helloworld =newHelloWorldImpl();
StaticProxy staticProxy =newStaticProxy(helloworld);
staticProxy.print();
}
}
二、动态代理
在java中要实现动态代理机制,则需要java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类的支持。
1.定义一接口
package com.zlc.proxy;
import java.lang.reflect.Method;
public interface InvocationHandler{
public Object invoke(Object proxy,Method method,Object[] args)throwsThrowable;
}
/*invoke()方法中的参数:
proxy - 在其上调用方法的代理实例
method - 对应于在代理实例上调用的接口方法的 Method 实例。
Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。
基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。*/
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。
2.DynamicProxyDemo.java
package com.zlc.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
interface Subject{
public String say(String name,int age); // 定义抽象方法say
}
class RealSubject implements Subject{ // 实现接口
publicString say(String name,int age){
return"姓名:"+ name +",年龄:"+ age ;
}
}
class MyInvocationHandler implements InvocationHandler{
privateObject obj ;
public Object bind(Object obj){
this.obj = obj ; // 真实主题类
returnProxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy,Method method,Object[] args)throwsThrowable{
Object temp = method.invoke(this.obj,args); // 调用方法
return temp ;
}
}
public class DynamicProxyDemo{
public static void main(String args[]){
Subjectsub=(Subject)newMyInvocationHandler().bind(newRealSubject());
String info =sub.say("阿成",21);
System.out.println(info);
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
浙公网安备 33010602011771号