Java 代理

219 阅读2分钟

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,比如生活中,去找房子,中介代理了房东的功能,你只要找中介就能满足你的需求

起源

为了减少耦合性,减少代码的复杂性,引入代理,同时增加对访问的可操作的,增加了代理模式

成员

image.png

  • 抽象角色:指代理角色和真实角色对外提供的公共方法,一般为一个接口
  • 代理对象:需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附 加自己的操作。将统一的流程控制都放到代理角色中处理!
  • 真实对象::需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。也就是真正的业 务逻辑在此。
  • 静态代理:一般是一对一的的存在也可能是一对多的存在,但是一对多的时候代码量增加不利于维护
  • 动态代理:妳补静态的一对多的缺陷,可以更好的对对象代理

使用

  • 静态代理使用
public interface Meassage {
      void  wash();
}

public  class service implements Meassage {
    @Override
    public void wash() {
        System.out.println("我干的");
    }
}


class Clinet  implements  Meassage{
  Meassage meassage;

    public Clinet(Meassage meassage) {
        this.meassage = meassage;
    }

    @Override
    public void wash() {
        System.out.println("我是代理");
        meassage.wash();
    }
}

 public static void main(String[] args) {
        Meassage meassage =new service();
        Clinet clinet =new Clinet(meassage);
        clinet.wash();
    }
  • 动态代理 在运行时再创建代理类和其实例,因此显然效率更低。要完成这个场景,需要在运行期动态创建一个Class。JDK提 供了 Proxy 来完成这件事情(也是用到Java 的反射)。基本使用如下:
//抽象角色 
interface Ap{ 
    void test(String a);
 }

//真实角色
 class ApiImpl{
 @Override 
public void test(String a)
 { 
System.out.println("真实实现:" + a); } 
}

//创建真实角色实例 
ApiImpl api = new ApiImpl(); 
//JDK动态代理: 
Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{Api.class},
 //JDK实现只能代理接口
\ new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
//执行真实对象方法
 return method.invoke(api, args); } });