设计模式-代理模式

概念:二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标

方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑

的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调

用和打扰,同时让附加功能能够集中在一起也有利于统一维护。

个人理解

为分离核心代码和非核心代码,创建一个代理类,

代理类中创建一个核心代码(核心功能)中的方法,

由代理类来间接调用核心代码中的方法,

再将非核心代码(附加功能)写在代理类中,

方便进行对附加功能进行统一维护

减少对核心功能的打扰

在通过代理模式进行功能增强的时,

不仅仅只有核心功能执行前后,

在catch,finally中都能增加附加功能

 

使用前
使用代理模式后

生活中的代理

广告商找大明星拍广告需要经过经纪人

合作伙伴找大老板谈合作要约见面时间需要经过秘书

房产中介是买卖双方的代理

相关术语

代理:将非核心逻辑剥离出来以后,封装这些非核心逻辑的类、对象、方法。

目标:被代理“套用”了非核心逻辑代码的类、对象、方法。

 

静态代理(一般不用)

静态代理确实实现了解耦,但是由于代码都写死了,完全不具备任何的灵活性。就拿日志功能来

说,将来其他地方也需要附加日志,那还得再声明更多个静态代理类,那就产生了大量重复的代

码,日志功能还是分散的,没有统一管理。

提出进一步的需求:将日志功能集中到一个代理类中,将来有任何日志需求,都通过这一个代理

类来实现。这就需要使用动态代理技术了。

动态代理

* 动态代理有两种(AOP底层用动态代理实现)
* 1.jdk动态代理:
* 要求必须有接口,最终生成的代理类和目标类实现相同的接口
* 在com.sun.proxy包下,类名为$proxy2
* 2.cglib动态代理
* 会继承目标类,并且和目标类在相同的包下

public Object getProxy(){
        /**
         * ClassLoader loader:
         *  指定加载动态生成的代理类的类加载器,
         * Class[] interfaces:
         *  获取目标对象实现的所有的接口的class对象的数组
         * InvocationHandler h:
         *  设置代理类中的抽象方法如何重写
         */
        ClassLoader classLoader = this.getClass().getClassLoader();

        Class<?>[] interfaces = target.getClass().getInterfaces();

        InvocationHandler h=new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = null;
                try {
                    System.out.println("日志,方法"+method.getName()+",参数:"+ Arrays.toString(args));
                    //proxy表示代理对象,method表示要执行的方法,args表示要执行的方法的参数列表
                    result = method.invoke(target, args);
                    System.out.println("日志,方法"+method.getName()+",结果:"+ result);
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("日志,方法"+method.getName()+",异常:"+ e);
                } finally {
                    System.out.println("日志,方法"+method.getName()+",方法执行完毕");
                }
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,h);
    }
posted @   别亦难  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示