代理模式

代理模式proxy

含义

代理,顾名思义,就是第三方作为一个中间来进行一些原本功能上的修改,例如房东和房介之间的关系,房东就是被代理目标,房介就是代理对象,房东和房介都有一个目标就是出租房屋,但是房东只需要出租,而房介会在房东出租前后做一些事情的添加,比如在出租房子之前进行看房,出租房子之后进行签协议等等操作。换句话说代理就是可以在被代理对象的基础上进行的附加操作

静态代理

在Java中静态代理也就是通过自己来完成代理类的创建,被代理目标类和代理类都实现同一个接口,然后代理类中有一个被代理目标的实例变量,当调用代理对象的方法时,会在该方法中调用被代理目标的方法

下面以租房为例子:

租房接口:

public interface ChuZu{
    void rent();
}
 

房东类(被代理对象):

 

public class Landlord implements ChuZu{
   public void rent{
       System.out.println("进行出租房屋");
  }
}

房介类(代理对象):

public class Agent implements ChuZu{
   private Landlord landlord;
   public Agent(Landlord landlord){
       this.landlord=landlord;
  }
   public void rent{
       System.out.println("进行看房");
       landlord.rent();
       System.out.println("签订合同");
  }
}

动态代理

动态代理需要使用到java.lang.reflect包下的proxy类来进行动态代理,动态代理也就是不需要创建这么一个代理类,通过proxy类来生成一个动态的代理对象,然后实现代理操作

具体操作是:首先调用proxy类的newProxyInstance()方法来获取到这个动态代理对象,但是这个方法有三个参数 (ClassLoader , Class< ? >[] , InvocationHandler) 其中ClassLoader 也就是类加载器,需要传入被代理目标类的类加载器,Class< ? >[] 需要传入被代理目标类的所有实现接口,handler就是进行代理附加的操作,例如方法执行前后执行日志功能,loader和interfaces都可以通过反射轻松获取到被代理目标类的类加载器和接口,InvocationHandler怎么传呢,InvocationHandler是一个接口,也没有实现类,但是我们知道接口是可以通过匿名内部类来创建一个接口对象的,在InvocationHandler接口中需要重写一个invoke方法 ,看到是否很眼熟,invoke也就是Method反射中进行方法调用的方法,在InvocationHandler接口中的invoke方法中有三个参数 (Object proxy, Method method, Object[] args) proxy是指当前被代理的对象,这个不用管,method是调用的方法,当代理类对象调用该方法时回去调用代理目标的方法,args为传入方法的参数

具体代码

ProxyTarget proxyTarget = new ProxyTarget();//这是一个被代理目标对象
ClassLoader classLoader=proxyTarget.getClass().getClassLoader();//获取代理目标的类加载器
Class<?>[] interfaces = proxyTarget.getClass().getInterfaces();//获取代理对象的接口
InvocationHandler ih=new InvocationHandler{
   @Override
   public Object invoke(Object proxy,Method method ,Object[] param){
       System.out.println("这是代理中调用方法前执行操作");
       Object result = Method.invoke(proxyTarget,param);
       System.out.println("这是代理中调用方法后执行操作");
       return result;
  }
}

Object proxyObject=Proxy.newProxyInstance(classLoader,interfaces,ih);//获得该代理对象

 

posted @ 2022-04-07 19:57  lenao  阅读(188)  评论(0)    收藏  举报