设计模式之代理模式

介绍

二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来一一解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。

静态代理

       构建一个目标对象属性,再添加一个构造器,在方法中调用目标对象的方法实现核心业务。

(虽然实现了解耦,但是代码都写死了,不具备任何的灵活性,可重复性差,不便于管理)

动态代理代码实现

//先创建一个类,在类里面写个方法,让方法返回代理对象
public class ProxyFactory {
    
    //目标对象
    private Object target;
    public ProxyFactory(Object target){
        this.target = target;
    }

    //返回代理对象
    public Object getProxy(){
        /**
        *Proxy.newProxyInstance()方法
        *有三个参数
        *第一个参数:ClassLoader:加载动态生成代理类的来加载器
        *第二个参数:interfaces:Class[]interfaces:目录对象实现的所有接口的class类型数组
        *第三个参数:InvocationHandler:设置代理对象实现目标对象方法的过程
        */
        //第一个参数:ClassLoader:加载动态生成代理类的来加载器
        ClassLoader classLoader =target.getclass().getclassLoader();
        //第二个参数:Class[]interfaces:目录对象实现的所有接口的class类型数组
        Class<?>[]interfaces =target.getclass().getInterfaces();
        //第三个参数:InvocationHandler:设置代理对象实现目标对象方法的过程
        InvocationHandler invocationHandler =new InvocationHandler(){
            //第一个参数:代理对象
            //第二个参数:需要重写目标对象的方法
            //第三个参数:method方法里面参数
            @Override
            public object invoke(object proxy,Method method,Object[] args)throws
            Throwable {
                //方法调用之前输出
                System.out.println("[动态代理][日志]"+method.getName()+",参数:"+ 
                Arrays.toString(args));
                //调用目标的方法
                Object result =method.invoke(target, args);
                //方法调用之后输出
                System.out.println("[动态代理][日志]"+method.getName()+",结果:"+ 
                result);
                return null;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
    }

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值