代理模式 --- 动态代理

一,动态代理介绍

动态代理和静态代理的角色都是一样,静态代理模式的代理类是我们提前写好的,而动态代理的类是动态生成的,其实动态代理与静态代理的本质一样,最终程序运行时都需要生成一个代理对象实例,通过它来完成相关增强以及业务逻辑,只不过静态代理需要硬编码的方式指定,而动态代理支持运行时动态生成这种实现方式。动态生成的好处很明显,在编码时,代理逻辑与业务逻辑互相独立,各不影响,没有侵入,没有耦合

二,与动态代理相关的两个类

  • Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method,Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现
  • Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:
    Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
    Static Class getProxyClass (ClassLoader loader,Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组

三,代码实现动态代理

1, 抽象角色

//抽象角色
public interface User {

    public void add();

}

2,真实角色

//真实角色
public class UserImpl implements User {

    public void add() {
        System.out.println("这是一个add方法");
    }

}

3,动态代理类生成的接口对象

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class InvocationHandlerProxy  implements InvocationHandler {

    private User user;

    public void setUser(User user) {
        this.user = user;
    }

    //动态生成代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                user.getClass().getInterfaces(),this);
    }

    //proxy:代理类
    //method:代理类的调用处理程序的方法 的对象
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        show1();
        Object invoke = method.invoke(user, args);
        show2();
        return invoke;
    }

    public void show1(){
        System.out.println("show方法1");
    }

    public void show2(){
        System.out.println("show方法2");
    }
}

【注意InvocationHandler导包】
在这里插入图片描述

4,测试

public class Test {
    public static void main(String[] args) {

        UserImpl userImpl = new UserImpl();

        InvocationHandlerProxy ihp = new InvocationHandlerProxy();
        ihp.setUser(userImpl);

        User proxy = (User) ihp.getProxy();

        proxy.add();
    }
}

5,运行结果

在这里插入图片描述

四,总结

动态代理的好处:

  • 可以使真实角色更加纯粹,不用去关注一些公共的事情
  • 公共的业务由代理来完成,实现业务的分工
  • 公共业务的要扩展的话,可以更加集中和方便
  • 一个动态代理,一般代理一类的业务,一个动态代理可以代理多个类,代理接口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值