设计模式----代理模式

代理模式概念

代理模式:生成一个占位(代理对象),来代理真实的对象,从而控制真实对象的访问

代理步骤:

1.代理对象和真实对象之间建立代理关系

2.实现代理对象的代理逻辑方法

基本uml图

代理模式UML图
代理模式分为静态代理和动态代理
java中最常用动态代理分两种,JDK动态代理,CGLIB动态代理

前置准备

先定义接口和实现
在这里插入图片描述
在这里插入图片描述

1.静态代理

在这里插入图片描述
静态代理是直接继承HelloWord接口,传入接口。通过重写其中的sayHelloWord方法,在其中调用了之前的方法
优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。
缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。

2.动态代理

DK的动态代理是通过java.lang.reflect.*包实现的
在JDK代理中,要实现代理,必须实现java.lang.reflect.InvocationHandler接口,其中定义了invoke方法,并提供数组用于参数的传递
在这里插入图片描述建立代理对象和真实对象之间的关系,使用了bind方法完成的,先用类属性target保存了真实对象,然后通过下面方法生成了代理对象在这里插入图片描述
其中newProxyInstance包含三个参数
1.类加载器,用了target本身类加载器
2.把生成的动态代理对象挂到那些接口下,这个就是放在了target实现的接口下了。HelloWorldImpl对象的接口是HelloWorld,代理对象可以这样声明:HelloWorld proxy=…
3.定义方法逻辑的代理类,this代表当前的对象,必须要实现invoke方法

3.CGLIB动态代理

JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对final修饰的类进行代理。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
JDK动态代理必须提供接口才能使用,在一些不能提供接口的环境中,只能采用其他第三方技术,比如CGLIB动态代理。它的优势在于不需要提供接口。只要一个非抽象类就能实现动态代理
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值