Java设计模式之代理模式
代理模式:
我们先理解下面几个类,或许对你有所帮助。
1.InvocationHandler
在代理模式中我们需要实现该接口。该接口有一个方法invoke()方法,如下:
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;
package org.shen.proxy;public interface Subject {public String say(String name,int 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);}}