设计模式自用笔记 —— 代理模式

代理模式分为静态代理和动态代理,静态代理在编译期确定,而JDK动态代理则在运行时生成,无需预先定义代理类。GcLib代理支持对类的动态代理,尤其适用于无法代理接口的情况。三种代理模式各有优缺点,适用场景不同。
摘要由CSDN通过智能技术生成

一. 概念

 将类和对象按某种布局组成更大的结构。

  • 类结构型型:通过继承机制组织接口和类
  • 对象结构型:通过组合和聚合来组合

二. 分类

在这里插入图片描述

三. 代理模式

在这里插入图片描述

  • 静态代理:在编译期生成
  • 动态代理:在运行时动态生成。JDK代理和CGLib代理。

四. 组成结构

在这里插入图片描述

五. 静态代理

在这里插入图片描述
代理模式是在不修改目标对象(被代理对象)的基础上,通过代理对象(扩展代理类),进行一些功能的附加与增强——>静态代理是在不改变源代码的基础上增加新的功能。
在这里插入图片描述

五. JDK动态代理

动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的.java源文件——>jdk运行期间动态创建class字节码并加载JVM——>代理对象在程序运行的过程中动态在内存构建,可以灵活的进行业务功能的切换。在这里插入图片描述在这里插入图片描述

通过定义代理工厂,利用Proxy的newProxy方法,实现代理对象的创建。可以有效的避免静态代理每个目标类都需要创建一个代理类的缺陷。

六. GcLib代理

 由于代理对象,在使用Proxy类的newProxyInstance创建代理对象时,你需要指定一个接口列表来表示代理对象所应该实现的接口。
 而GCLib能支持类的动态代理。

 		<dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.1</version>
        </dependency>

cglib生成的代理对象是目标对象类的子类。 它通过ASM转换字节码生成代理类。它不能代理final修饰的类\方法(final修饰的类不能有子类,final修饰的方法不能重新)
注:需要使用JDK8及以下版本(在Java 9之前,Java的所有内部类都可以被访问。然而,在Java 9中,Oracle引入了一个新的特性,称为Java平台模块系统 (JPMS),以便更好地封装Java的内部类。当试图通过反射访问这些内部类时,就会出现Unable to make protected final 错误。尝试将版本或添加以下VM参数:
–add-opens java.base/java.lang=ALL-UNNAMED)

七. 三种代理模式的对比

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值