代理模式分为静态代理与动态代理
1、静态代理
静态模式代理步骤
1)、定义一个接口
package com.mr.cheng.proxy; /** * 动物属性接口 * @author zwc * */ public interface Animal { public void canSpeak(); public void canRun(); }
2)、定义该接口的实现类
package com.mr.cheng.proxy; /** * 接口实现类 * @author zwc * */ public class Monkey implements Animal { @Override public void canSpeak() { System.out.println("动物可以交,喊!"); } @Override public void canRun() { System.out.println("动物可以跑!"); } }
3)、定义一个静态代理类
package com.mr.cheng.proxy; /** * 代理类 * @author zwc * */ public class AnimalProxy implements Animal { private Animal animal; public AnimalProxy(Animal animal){ this.animal = animal; } @Override public void canSpeak() { animal.canSpeak(); } @Override public void canRun() { animal.canRun(); } }
4)、测试该静态代理
package com.mr.cheng.proxy; public class AnimalTest { public static void main(String[] args) { Animal animal = new Monkey(); AnimalProxy animalProxy = new AnimalProxy(animal); animalProxy.canRun(); animalProxy.canSpeak(); } }
总以上代码可以看得出,接口如果新增一个实现类,必须新增一个代理。这样代码重复性就非常的高。动态代理就可以避免这种现象。
2、动态代理
代理模式分为jdk代理与cglib代理
jdk代理,代理类必须实现InvocationHandler类中的invoke方法,
1)、定义一个接口
package com.mr.cheng.proxy; public interface BookInter { public void canRead(); }
2)、定义一个接口实现类
package com.mr.cheng.proxy; public class BookInterImpl implements BookInter { @Override public void canRead() { System.out.println("书是用来阅读的!"); } }
3)、定义jdk代理
package com.mr.cheng.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * jdk代理 必须实现InvocationHandler类 * @author zwc * */ public class BookProxy implements InvocationHandler{ private Object object; /** * 绑定委托对象并返回一个代理类。 * @param target * @return */ public Object bind(Object target) { this.object = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 重新invoke调用方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; System.out.println("方法开始调用"); result = method.invoke(object, args); System.out.println("方法结束调用"); return result; } }
4)、测试
package com.mr.cheng.proxy; public class BookTest { public static void main(String[] args) { BookProxy BookProxy = new BookProxy(); BookInter bookInter = (BookInter) BookProxy.bind(new BookInterImpl()); bookInter.canRead(); } }
参考:http://kuangbaoxu.iteye.com/blog/192804 http://www.open-open.com/home/space-24-do-blog-id-12.html