Dynamic proxy(一)

Proxy Pattern

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

当两个类之间需要通信时,引入第三方类 将两个类的关系解耦看,对于客户方只需要了解代理类即可,不过代理类和委托类需要实现同一接口,因为实际调用的还是委托类的方法。

什么是动态代理模式

静态代理

  • Subject 实例接口
package ProxyPattern.staticProxy;

public interface Subject {
    void doSomething();
}
  • RealSubject 实现接口逻辑
package ProxyPattern.staticProxy;

public class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("do something! ");
    }
}

如果想在doSomething()前后加上一些日志监控等等一些业务逻辑,而需要被代理的类无需改动。

  • SubjectProxy 代理对象
package ProxyPattern.staticProxy;

public class SubjectProxy implements Subject {
    private Subject subjectImpl = null;

    public SubjectProxy(Subject subject) {
        this.subjectImpl = subject;
    }

    @Override
    public void doSomething() {
        System.out.println("before real subject");
        subjectImpl.doSomething();
        System.out.println("after real subject");
    }
}
  • TestRunner
package ProxyPattern.staticProxy;

public class TestRunner {
    public static void main(String[] args) {
        Subject subjectProxy = new SubjectProxy(new RealSubject());
        subjectProxy.doSomething();
    }
}

结果

before real subject
do something! 
after real subject

动态代理

为什么要动态代理

静态代理的缺点

  • 代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
  • 静态代理只能实现特定的某个service,假设想要代理多个实现类,就需要写多个代理。

动态代理的好处

通过一个代理类完成全部的代理功能

动态代理的应用

  • Spring的AOP
  • 远程代理

相关参考

Java 动态代理作用是什么?
JAVA学习篇--静态代理VS动态代理

你可能感兴趣的:(Dynamic proxy(一))