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
- 远程代理