先来看看Java的静态代理,假设有如下接口和实现方法:
package proxy;
public interface Subject {
public void request();
public void response();
}
package proxy;public class RealSubject implements Subject{ public void request() {
System.out.println("request...");
} public void response() {
System.out.println("response...");
}}
然后,需求来了,希望在执行方法前后加某个其他的操作,那么静态代理会这么做:
package proxy.staticProxy;import proxy.RealSubject;
import proxy.Subject;public class ProxySubject implements Subject{
RealSubject subject;
public ProxySubject(RealSubject subject){
this.subject = subject;
}
public void request() {
System.out.println("....before");
subject.request();
System.out.println("....after");
} //当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。
//这就增加了代码的复杂度。动态代理就可以避免这个缺点。
public void response() {
System.out.println("....before");
subject.request();
System.out.println("....after");
}
}
然后客户端的代码会这么写:
package proxy.staticProxy;import proxy.RealSubject;public class StaticProxyTestMain { public static void main(String[] args) {
RealSubject subject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(subject);
proxySubject.request();
//proxySubject.response();
}}
从上面的代码页可以看出,一旦接口变了,所有的实现类和代理类里都需要做个实现。
这就增加了代码的复杂度。
怎么破?使用动态代理….