本文共 5191 字,大约阅读时间需要 17 分钟。
代理模式:代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息,过滤消息,把消息转发给委托类,以及事后处理消息等,代理类与委托类之间存在关联关系,代理类对象本身不真正实现服务,而是通过委托类的对象的相关方法来提供特定的服务,可以借助代理模式增加一些功能(开闭原则,增加功能),代理类的分类:
(1)静态代理:在程序运行前,代理类的.class文件已经存在了
/** * * @author Administrator * @date 2018年10月2日 * @package design_pattern * 接口,一个人可以被代理的行为 */interface AgencyTest{ public void buyHouse(); public void findJob();}class worker implements AgencyTest{ @Override public void buyHouse() { System.out.println("工人:我要买一套两居室的价格在30万左右的房子"); } public void findJob() { System.out.println("工人:我想要找一个不拖欠工资的工作"); }}class whiteCollar implements AgencyTest{ @Override public void buyHouse() { // TODO 自动生成的方法存根 System.out.println("白领:我想要买一套交通方便的房子,面积不要太大"); } @Override public void findJob() { // TODO 自动生成的方法存根 System.out.println("白领:我想要找一份加班少,待遇好的公司"); }}class Agency implements AgencyTest{ private AgencyTest person; public Agency(AgencyTest person) { this.person = person; } @Override public void buyHouse() { // TODO 自动生成的方法存根 System.out.println("中介:您好,欢迎选择购房中介,您有什么需求?"); person.buyHouse(); System.out.println("中介:我们会尽快帮您找到合适的房源"); } @Override public void findJob() { // TODO 自动生成的方法存根 System.out.println("中介:您好,欢迎光临工作无忧,您对工作有什么需求?"); person.findJob(); System.out.println("中介:感谢您的光临,我们会尽快帮您匹配合适的岗位"); }}public class StaticAgencyDemo{ public static void main(String[] args) { worker w = new worker(); whiteCollar wc = new whiteCollar(); Agency agency1 = new Agency(w); agency1.buyHouse(); agency1.findJob(); Agency agency2 = new Agency(wc); agency2.buyHouse(); agency2.findJob(); }}
(2)动态代理:在程序运行时,运用反射机制动态创建而成,JDK动态代理代理的是接口,通过Proxy的newProxyInstance得到代理对象;Cglib动态代理,代理的是类,不需要业务继承接口,通过派生子类来实现代理
动态代理的好处:简化了编程工作,提高了软件系统的可扩展性
//JDK动态代理import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 目标要实现的接口 * @author Administrator * @date 2018年10月2日 * @package design_pattern */interface JDKDemoInter{ public void detailShow(String s);}/** * 要代理的类 * 必须要有实现的接口 * @author Administrator * @date 2018年10月2日 * @package design_pattern */class JDKClassDemo implements JDKDemoInter{ private String name; @Override public void detailShow(String s) { // TODO 自动生成的方法存根 System.out.println("你好,我是JDKClassDemo,你输入的是"+s); } public String getName() { return name; } public void setName(String name) { this.name = name; }}/** * jdk动态代理 * 使用java.lang.reflect.proxy类来实现代理 * @author Administrator * @date 2018年10月2日 * @package design_pattern */class JDKProxy1{ private Object obj; public JDKProxy1(Object obj) { this.obj = obj; } //生成代理对象 /** * classloader 对象的类加载器 * Class [] interfaces目标对象实现的接口类型 * InvocationHandler 事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入 * @return */ public Object getProxyInstance() { return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), new InvocationHandler(){ @Override public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("执行前"); Object returnObj = method.invoke(obj, args); System.out.println("执行后"); return returnObj; } }); }}class JDKProxy2 implements InvocationHandler{ private Object obj; public Object getInstance(Object obj) { this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("执行前"); Object returnObj = method.invoke(this.obj, args); System.out.println("执行后"); return returnObj; }}public class JDKDynamicAgencyDemo { public static void main(String[] args) { // TODO 自动生成的方法存根 JDKClassDemo demo = new JDKClassDemo(); JDKDemoInter proxyDemo = (JDKDemoInter)new JDKProxy1(demo).getProxyInstance(); proxyDemo.detailShow("000"); JDKClassDemo demo1 = new JDKClassDemo(); JDKDemoInter proxyDemo1 = (JDKDemoInter)new JDKProxy2().getInstance(demo1); proxyDemo.detailShow("111"); }}
//cglib动态代理import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;class CglibClass{ public void say() { System.out.println("this is CglibClass"); } public static void say1() { System.out.println("this is static"); } public final void say2() { System.out.println("this is final"); }}class CglibProxy implements MethodInterceptor{ //目标对象 private Object obj; public CglibProxy(Object obj) { this.obj = obj; } //生成代理对象 public Object getProxyInstance() { //设置工具类 Enhancer en = new Enhancer(); //设置父类 en.setSuperClass(obj.getClass()); //设置回调函数 en.setCallable(this); //返回创建的子类(代理对象),因为cglib又被称为子类代理 return en.create(); } @Override public Object intercept(Object arg0,Method method,Object[] arg2,MethodProxy arg3) throws Throwable { System.out.println("执行前"); Object returnObj = method.invoke(obj, arg2); System.out.println("执行后"); return returnObj; }}public class cglibDynamicAgencyDemo { public static void main(String[] args) { // TODO 自动生成的方法存根 CglibClass cglib = new CglibClass(); CglibClass proxy = (CglibClass)new CglibProxy(cglib).getProxyInstance(); System.out.println(proxy); proxy.say(); proxy.say1(); proxy.say2(); }}
转载地址:http://ugeii.baihongyu.com/