动态代理

代理模式

简介

  • 代理模式的好处

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

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

    • 接口

    • //租房接口
      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;
          }
      }
      
posted @ 2021-01-23 18:38  immortal_mode  阅读(77)  评论(0)    收藏  举报