JAVA之代理模式(一)

86 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

一、什么是代理

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象;这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

二、代理的方式

java创建代理对象分为:静态代理动态代理;其中动态代理又分为基于jdk(接口)的动态代理,基于CGLLIB(子类)的动态代理

静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,即代理类和委托类的关系再程序运行前就已经存在。

动态代理:在运行期间使用动态生成字节码形式,动态创建代理类。使用的工具有 jdkproxy、cglibproxy 等。

image.png

三、代理的实现

1、代理结构图:

image.png

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、静态代理可以在不修改目标对象的前提下扩展目标对象的功能。

接下一节我们继续学习动态代理的优缺点和实现。