# gupaoedu-vip-pattern-proxy **Repository Path**: 970425268/gupaoedu-vip-pattern-proxy ## Basic Information - **Project Name**: gupaoedu-vip-pattern-proxy - **Description**: java_架构师_设计模式_代理模式 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-06-13 - **Last Updated**: 2022-01-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java架构师-设计模式-代理模式 --- ## 代理模式:***找人办事,增强职责*** spring 可参考 ApplictionContext,Calender --- # 应用场景 > 租房中介、售票黄牛、婚介、经纪人、快递、事务代理、非侵入式日志监听等,这些都是代理模式的实际体现。代理模式(Proxy Pattern)的定义也非常简单,是指为其他对象提供一种代理,以控制对这个对象的访问。 代理对象在客服端和目标对象之间起到中介作用,代理模式属于结构型设计模式。使用 代理模式主要有两个目的:一保护目标对象,二增强目标对象。 # 分类 * 静态代理 * 动态代理 * jdk代理 * 委托类需要实现接口 * 代码比静态代理更少 * 使用的是反射完成代理 * cglib代理 * 不需要委托类实现接口 * 使用的是字节码重组的方式进行代理 * 不能对final修饰的类进行代理 * 基于asm字节码重组技术 > **静态代理与动态代理区别**: 1、静态代理只能通过手动完成代理操作,如果被代理类增加新的方法,代理类需要同步新增,违背开闭原则。 2、动态代理采用在运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开闭原则。 3、若动态代理要对目标类的增强逻辑扩展,结合策略模式,只需要新增策略类便可完成,无需修改代理类 通俗说静态代理 对代理对象有限制,而动态代理只要实现同一个接口,不管是人或动物也行 > **jdk代理与cglib代理区别**: CGLIB创建的动态代理对象比JDK创建的动态代理对象的性能更高,但是CGLIB创建代理对象时所花费的时间却比JDK多得多。所以对于单例的对象,因为无需频繁创建对象,用CGLIB合适,反之使用JDK方式要更为合适一些。同时由于CGLib由于是采用动态创建子类的方法,对于final修饰的方法无法进行代理。 > 1.JDK动态代理是实现了被代理对象的接口,CGLib是继承了被代理对象。 > 2.JDK和CGLib都是在运行期生成字节码,JDK是直接写Class字节码,CGLib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。 > 3.JDK调用代理方法,是通过反射机制调用,CGLib是通过FastClass机制直接调用方法,CGLib执行效率更 # 静态代理 举个例子:人到了适婚年龄,父母总是迫不及待希望早点抱孙子。而现在社会的人在各种压力之下,都选择晚婚晚育。于是着急的父母就开始到处为自己的子女相亲,比子女自己还着急。这个相亲的过程,就是一种我们人人都有份的代理,静态代理是已存在,和明确关系的。 # 动态代理 ## JDK实现方式 JDK实现方式原理看手写jdk Proxy,动态代理实现 InvocationHandler接口 ## 手写jdk Proxy(彩蛋) 1、拿到被代理对象的引用,并且获取到它的所有的接口,反射获取。 2、JDK Proxy 类重新生成一个新的类、同时新的类要实现被代理类所有实现的所有的接口。 3、动态生成 Java 代码,把新加的业务逻辑方法由一定的逻辑代码去调用(在代码中体现)。 4、编译新生成的 Java 代码.class。 5、再重新加载到 JVM 中运行 ## cglib实现方式 //JDK是采用读取接口的信息 //CGLib覆盖父类方法 //目的:都是生成一个新的类,去实现增强代码逻辑的功能 //JDK Proxy 对于用户而言,必须要有一个接口实现,目标类相对来说复杂 //CGLib 可以代理任意一个普通的类,没有任何要求 //CGLib 生成代理逻辑更复杂,效率,调用效率更高,生成一个包含了所有的逻辑的FastClass,不再需要反射调用 //JDK Proxy生成代理的逻辑简单,执行效率相对要低,每次都要反射动态调用 1、无法代理final修饰的方法 # 总结 代理模式的优缺点 ## 优点 1、代理模式能将代理对象与真实被调用的目标对象分离。 2、一定程度上降低了系统的耦合度,扩展性好。 3、可以起到保护目标对象的作用。 4、可以对目标对象的功能增强。 ## 缺点 1、代理模式会造成系统设计中类的数量增加。 2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。 3、增加了系统的复杂度