Java设计模式之代理模式
代理模式:
我们先理解下面几个类,或许对你有所帮助。
1.InvocationHandler
在代理模式中我们需要实现该接口。该接口有一个方法invoke()方法,如下:
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;
参数理解:
proxy:需要被调用的代理对象
method:代理对象的方法。
args:代理对象方法的参数。
大家可能在想,为什么一个类中有参数,有构造方法,有get和set器,有类名,有实现接口,父类等等,这里只有三个参数?
其实代理模式调用的是接口,接口有方法,接口名,接口的属性,方法的参数,所以invoke方法的参数可以满足代理。
2.Proxy
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
废话不多说了 直接上代码分析。
package org.shen.proxy;public interface Subject {public String say(String name,int age);}
Subject接口包含say方法,方法中有name和age属性。
package org.shen.proxy;public class RealSubject implements Subject{@Overridepublic String say(String name, int age) {return name + " -- " + age;}}
package org.shen.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyInvocationHandler implements InvocationHandler{private Object obj = null;public Object bind(Object obj){this.obj = obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object temp = method.invoke(obj, args);return temp;}}
package org.shen.proxy;public class TestProxy {public static void main(String[] args) {//使用代理MyInvocationHandler demo = new MyInvocationHandler();Subject sv = (Subject)demo.bind(new RealSubject());String info = sv.say("shenyc", 2);System.out.println(info);System.out.println("----------");//不使用代理//如果不使用代理,就会去实现接口Subject,即创建一个实现类//使用代理的话直接到代理那儿去拿接口。Subject s = new Subject() {@Overridepublic String say(String name, int age) {return name + " " +age ;}};String infoa = s.say("shenyc", 21);System.out.println(infoa);//new一个实例Subject ss = new RealSubject();String infob = ss.say("shenyc", 22);System.out.println(infob);}}
输出结果:
shenyc -- 2
----------
shenyc 21
shenyc -- 22