博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——代理模式
阅读量:6228 次
发布时间:2019-06-21

本文共 3587 字,大约阅读时间需要 11 分钟。

hot3.png

1、代理模式的概述

客户端通过代理对象渐渐与目标对象打交道,反之,目标对象委托代理对象与客户端进行交流。因此代理对象可以在目标对象方法前后,做出额外的操作,这就是代理AOP实现的原理。

2、原理图

输入图片说明

3、模型图

输入图片说明

4、静态代理代码演示

  • (1)目标对象:
public class RealSubject implements Subject {    @Override    public void request() {        System.out.println(" execute real subject request");    }}
  • (2)代理对象:
public class Proxy implements Subject {    private RealSubject realSubject;    public Proxy(RealSubject realSubject) {        this.realSubject = realSubject;    }    @Override    public void request() {        System.out.println(" before 织入逻辑");        try {            realSubject.request();        } catch (Exception e) {            System.out.println("ex:"+e.getMessage());            e.printStackTrace();        } finally {            System.out.println(" after 织入逻辑");        }    }}
  • (3)客户端调用接口
public interface Subject {    public void request();}
  • (4)客户端调用
public class Client {    public static void main(String[] args) {        Subject subject = new Proxy(new RealSubject());        subject.request();    }}

5、动态代理代码演示

一、JDK代理

1、代理类

import cn.evchar.proxy.aop.RealSubject;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class JdkProxySubject implements InvocationHandler {    private RealSubject realSubject;    public JdkProxySubject(RealSubject realSubject) {        this.realSubject = realSubject;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Object res = null;        System.out.println("before");        try {            res = method.invoke(realSubject,args);        } catch (Exception e) {            System.out.println("ex: "+e);            throw e;        } finally {            System.out.println("after");        }        return res;    }}

2、客户端调用

import cn.evchar.proxy.aop.RealSubject;import cn.evchar.proxy.aop.Subject;import java.lang.reflect.Proxy;public class Client {    public static void main(String[] args) {        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");        Subject subject = (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(),                new Class[]{Subject.class},new JdkProxySubject(new RealSubject()));        subject.request();        subject.hello();    }}

二、 cglib代理

1、代理类

import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class DemoMethodInterceptor implements MethodInterceptor {    @Override    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {        System.out.println("before  in cglib");        Object res = null;        try {            res = methodProxy.invokeSuper(obj,args);        } catch (Exception e) {            System.out.println("ex "+ e);            throw e;        } finally {            System.out.println("after  in cglib");        }        return res;    }}

2、客户端调用

import cn.evchar.proxy.aop.RealSubject;import cn.evchar.proxy.aop.Subject;import net.sf.cglib.proxy.Enhancer;public class Client {    public static void main(String[] args) {        Enhancer enhancer = new Enhancer();        // 目标对象        enhancer.setSuperclass(RealSubject.class);        // 织入代码        enhancer.setCallback(new DemoMethodInterceptor());        // 生成 代理类        Subject subject = (Subject) enhancer.create();        subject.hello();        subject.request();    }}

6、Cglib 与JDK 动态代理比较

1、JDK只能针对有接口的类的接口方法进行动态代理

2、Cglib基于继承来实现代理,无法对static,final 类进行代理

3、Cglib基于继承来实现代理,无法对private,static 方法进行代理

4、反之JDK 不能对private 进行代理

转载于:https://my.oschina.net/u/3136594/blog/1592722

你可能感兴趣的文章
git 笔记
查看>>
C# SignalR 即时通信
查看>>
Android之——自己主动挂断电话的实现
查看>>
springcloud-01-介绍
查看>>
sqlite自己主动更新数据库
查看>>
管理中的外行与内行
查看>>
【5】JVM-垃圾收集器
查看>>
音频变调技术
查看>>
Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
查看>>
解决App can’t be opened because it is from an unidentified developer
查看>>
读《那些年,那些事 一个程序猿的奋斗史》 一点自己的感触
查看>>
Java,泛型类型通配符和C#对照
查看>>
LeetCode(1) Symmetric Tree
查看>>
Curl命令
查看>>
HDU 2181 DFS
查看>>
Linux 用C语言判断文件和文件夹
查看>>
Eclipse中jsp、js文件编辑时,卡死现象解决汇总
查看>>
图的基本知识
查看>>
leetcode第一刷_Same Tree
查看>>
高速排序之算法导论实现
查看>>