设计模式之代理模式(结构型模式)

134 阅读2分钟

代理模式的概念

定义

代理模式是为某个对象提供一个代理对象,并且由代理对象控制对原来对象的访问.

所有的角色

  • Subject 抽象类
  • RealSubject 具体的实现类
  • Proxy 代理类 与真实的业务代码接触

代理的模式

静态代理

抽象的接口类

public interface House {
    void rentHouse();
}

真正被调用,去实现具体操作的类

public class Landlord implements House{
    @Override
    public void rentHouse() {
        System.out.println("要出租房");
    }
}

代理类

public class Proxy implements House{
    private Landlord landlord;

    public Proxy(Landlord landlord){
        this.landlord = landlord;
    }
    @Override
    public void rentHouse() {
        System.out.println("带你去看房");
        landlord.rentHouse();
        System.out.println("收费了");
    }
}

main 方法

public static void main(String[] args) throws CloneNotSupportedException {
    Proxy proxy = new Proxy(new Landlord());
    proxy.rentHouse();
}

执行结果

带你去看房
要出租房
收费了

这就是静态代理的全过程.

代理类和真实的类都要去实现抽象的类,这种静态代理很好理解,但是因为他全部都是事先写好的,假如在有其他的功能加入,那么这个代理类就要修改了,违背了开闭原则

动态代理

JDK动态代理

修改一下上面的 Proxy 类名为ProxyNew 防止重名

public class ProxyNew {
   private Object object;

   public ProxyNew(Object object){
       this.object = object;
   }
   public Object getProxyInstance(){
      return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), (Object proxy, Method method, Object[] args)->{
          System.out.println("动态代理执行开始");
          Object invoke = method.invoke(object, args);// 反射执行
          System.out.println("动态代理执行开始结束");
          return invoke;
      });
   }
}

main

public static void main(String[] args) throws CloneNotSupportedException {
    ProxyNew proxy = new ProxyNew(new Landlord());
    House house = (House) proxy.getProxyInstance();
    house.rentHouse();
}

执行结果代理类通过 Proxy.newInstance() 方法生成

动态代理执行开始
要出租房
动态代理执行开始结束

这就是JDK动态代理

总结

  • 静态代理,代理类需要手动编写,只适用于少量明确需求下,有不确定因素情况下不适用
  • 动态代理:代理类通过 Proxy.newInstance() 方法生成,可以在程序运行中生成,比较灵活,减少编码.
  • JDK实现的代理中不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,它们的实质是面向接口编程.
  • CGLIB 动态代理的实现机制是生成目标类的子类,通过调用父类(目标类)的方法实现,在调用父类方法时再代理中进行增强