携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
一、什么是代理
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象;这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
二、代理的方式
java创建代理对象分为:静态代理,动态代理;其中动态代理又分为基于jdk(接口)的动态代理,基于CGLLIB(子类)的动态代理。
静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,即代理类和委托类的关系再程序运行前就已经存在。
动态代理:在运行期间使用动态生成字节码形式,动态创建代理类。使用的工具有 jdkproxy、cglibproxy 等。
三、代理的实现
1、代理结构图:
2、静态代理的优缺点
编写代理类:实现目标的接口或者直接继承目标类,完成逻辑的修改,
比如:
接口实现方式创建目标类接口,目标类和代理类。
先定义接口类:
public interface ByClothes {
void clothes(String size);
}
再定义目标对象——实现接口:
public class ClothesFactory implements ByClothes {
@Override
public void clothes(String size) {
System.out.println("已经为您制作好了一整套size为"+size+"的衣服。。。。。。。。");
}
}
再制造代理对象——实现接口:
public class proxy implements ByClothes {
//被包含的真是对象
public ClothesFactory factory;
public proxy(ClothesFactory factory) {
// TODO Auto-generated constructor stub
this.factory = factory;
}
@Override
public void clothes(String size) {
FrontService();
factory.clothes(size);
endService();
}
//前置服务
public void FrontService() {
System.out.println("根据您的需求进行市场调研");
}
//前置服务
public void endService() {
System.out.println("为您提供一条龙的包办服务");
}
}
最后,创建测试类:
public class Test {
public static void main(String[] args) {
ClothesFactory clothesFactory = new ClothesFactory();
proxy proxy = new proxy(clothesFactory);
proxy.clothes("XXl");
}
}
优点:可以在不修改目标对象的前提下扩展目标对象的功能
缺点:如果需要代理多个类,每个类都会有一个代理类,会导致代理类无限制扩展;如果类中有多个方法,同样的代理逻辑需要反复实现、应用到每个方法上,一旦接口增加方法,目标对象与代理对象都要进行修改
四、总结
1、Java静态代理和动态代理的区别在于代理类proxy是否动态生成;而JDK动态代理和CGLIB动态代理区别在于target是接口的实现时,就使用JDK动态代理,否是就使用Cglib代理。
2、静态代理可以在不修改目标对象的前提下扩展目标对象的功能。
接下一节我们继续学习动态代理的优缺点和实现。