首页 > 其他 > 详细

动态代理

时间:2021-01-24 01:05:13      阅读:19      评论:0      收藏:0      [点我收藏+]

代理模式

简介

技术分享图片

  • 代理模式的好处

    • 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
    • 公共业务交给代理角色,实现了业务的分工
    • 公共业务发生扩展,方便集中管理
  • 缺点

    • 一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率降低
  • 静态代理

    • 接口

    • //租房接口
      public interface Rent {
          public void rent();
      }
      
    • 真实角色

    • //房东
      public class House implements Rent{
      
          public void rent() {
              System.out.println("房东出租房子...");
          }
      }
      
      
    • 代理角色

    • //中介
      public class Client implements Rent{
      
          private House house;
      
      
          public Client(House house) {
              this.house = house;
          }
      
          public void rent() {
              seeHouse();
              house.rent();
              contract();
          }
      
          public void seeHouse(){
              System.out.println("中介带看房啊...");
          }
      
          public void contract(){
              System.out.println("中介签合同...");
          }
      
      }
      
      
    • 客户

    • //客户
      public class Proxy {
      
          public static void main(String[] args) {
              Client client = new Client(new House());
      
              client.rent();
          }
      }
      
      
  • 纵向开发 横切进去

  • 技术分享图片

  • 动态代理

    • 动态代理和静态代理角色一样

    • 动态代理使动态生成的,不是我们直接写的

    • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理

      • 基于接口----jdk 动态代理
      • 基于类: cglib
      • java字节码 java ssist
    • 需要了解2个类

    • proxy 代理 invocationHandler 调用处理程序

    • 解决了静态代理的问题

    • public class HouseInvocationHandler implements InvocationHandler {
      
          private Object target;
      
      
          public void setTarget(Object target) {
              this.target = target;
          }
          public Object getProxy(){
             return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
          }
      
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              method.invoke(target, args);
              System.out.println(method.getName());
              return null;
          }
      }
      

动态代理

原文:https://www.cnblogs.com/immortal-mode/p/14318549.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!