【模式设计】什么是代理模式?

简介

作用:为某个对象提供一种代理,用来控制对这个对象的访问。 

具体完成:预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被代理对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。

使用的地方:在直接访问对象时会带来许多问题,比如说:要访问的对象在远程的机器上。比如spring里面的AOP就是使用动态代理模式实现:动态代理实现 AOP,如果 Bean 实现了接口就使用 JDK 代理,否则使用 CGLib 代理。


静态代理

创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法,并在方法的前后增加别的业务逻辑。

缺点:一个代理类只能为一个类服务,如果需要代理很多类,那么比较麻烦。

1、接口:

2、被代理类:

3、代理类

 4、代理类的调用:


动态代理

目的和静态代理一样,只不过利用反射机制在运行时创建代理类,也就是说代理类和被代理类在运行之前的关系是不确定的,而静态代理的话,程序运行之前两者的关系就已经确定了。动态代理可以完成一个代理类动态代理多个不同的类。有两种方法可以完成动态代理,如果被代理类实现了接口,那么可以使用java自带的proxy,否则只能使用CGLib。

proxy完成动态代理

1、构建代理类,具体来说创建一个handler类来实现InvocationHandler接口。然后在接口里重写invoke方法,参数为Object类型的被代理对象,然后Method方法,以及Object数组参数args。在里面调用method的invoke(),这里面调用被代理的对象的方法,在方法前后执行一些业务逻辑;

2、 执行动态代理,创建被代理的对象,然后传入代理类里面,得到代理类的对象,调用proxy类的静态方法newProxyInstance(),参数是被代理类的类加载器,被代理类的接口,以及代理类的对象。

 

中间少的:

 (HelloInterface) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), handler);

因此如果要代理不同的类,只需传入不同的类加载器以及接口即可。 


参考:

https://www.jianshu.com/p/9bcac608c714

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值