说说java中的代理模式
代理模式是为其他对象提供一种代理以控制对这个对象的访问,或是为了提供额外或不同的操作,而插入用来代替“实际”对象的对象。
代理模式中涉及到的角色:
抽象角色:真实对象和代理对象的共同接口。
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实的对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时代理对象可以在执行真实对象操作时,附加其他操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
解释这几个角色,最好理解的就是静态代理模式,首先就是抽象角色。
interface Interface{void doSomething();void somethingElse(String arg);}?定义一个抽象类或接口,是代理角色和真实角色都要实现的动作或行为。
接着是定义真实角色,就是实际处理业务的类
class RealObject implements Interface{public void doSomething() {// TODO Auto-generated method stubSystem.out.println("doSomething");}public void somethingElse(String arg) {// TODO Auto-generated method stubSystem.out.println("somethingElse "+arg);}}? 在代理角色中需要一个真实角色的引用,因为实际处理业务是真实角色处理的。
class SimpleProxy implements Interface{private Interface proxied;public SimpleProxy(Interface proxied){this.proxied=proxied;}public void doSomething() {// TODO Auto-generated method stubSystem.out.println("SimpleProxy doSometing");proxied.doSomething();}public void somethingElse(String arg) {// TODO Auto-generated method stubSystem.out.println("SimpleProxy somethingElse "+arg);proxied.somethingElse(arg);}}?在代理角色中就可以增加一些额外的操作。通过这个静态代理就可以大致明白代理模式的含义。
java的动态代理可以动态地创建代理并动态地处理对所代理方法的调用。大致步骤是:
1、 创建一个实现接口InvocationHandler的类,它必须实现invoke方法。
2、创建被代理的类以及接口。
3、通过Proxy 的静态方法newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)创建一个代理。
4、通过代理调用方法。
?通过API了解到InvocationHandler是代理实例的调用处理程序实现的接口。每个代理实例都具有一个关联的调用处理程序,并将其指派到它的调用处理程序的invoke方法。这个接口中包含一个invoke方法并有三个参数Proxy在其上调用方法的代理实例,一般这个参数用不上。method对应于在代理实例上调用的接口方法的Method实例。args包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数则为null。
首先是实现InvocationHandler接口。
private Object proxied;public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubSystem.out.println(""+proxy.getClass()+","+method+","+args);if(args!=null){for(Object arg:args){System.out.println(" "+arg);}}return method.invoke(proxied, args);}? 指定真实角色和抽象角色(接口)
interface Interface{void doSomething();void somethingElse(String arg);}class RealObject implements Interface{public void doSomething() {// TODO Auto-generated method stubSystem.out.println("doSomething");}public void somethingElse(String arg) {// TODO Auto-generated method stubSystem.out.println("somethingElse "+arg);}}? 然后再通过Proxy.newProxyInstance()方法得到代理对象Interface proxy=(Interface)Proxy.newProxyInstance(Interface.class.getClassLoader(), real.getClass().getInterfaces(), new DynamicProxyHandler(real));? 这样就实现了java动态代理的全过程。