静态代理类:
由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。不使用其他Java类,做到动态的调用接口的不同实现。
静态代理的优缺点
优点:不需要其他的类,实现简单;
缺点:需要更改源代码实现
如下, ProxySubject 类是代理类,RealSubject 类是委托类,这两个类都实现了ISubject 接口。其中RealSubject 类是ISubject 接口的真正实现者,而ProxySubject 类是通过调用RealSubject 类的相关方法来提供特定服务的。RealSubject 类的request()方法会调用被代理的RealSubject 对象的request()方法,并且在方法调用前后都会执行一些简单的打印操作。
由此可见,代理类可以为委托类预处理消息、把消息转发给委托类和事后处理消息等。
1、ISubject.java
package proxy;
/**
* @author Chu
* @version 创建时间:2013-06-13 上午08:30:12
*/
public interface ISubject {
public void request();
}
2、RealSubject.java
package proxy;
/**
* @author Chu
* @version 创建时间:2013-06-13 上午08:31:32
*/
public class RealSubject implements ISubject {
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("realSubject requesting");
}
}
3、ProxySubject.java
package proxy;
/**
* @author Chu
* @version 创建时间:2013-06-13 上午08:33:08
*/
public class ProxySubject implements ISubject {
private RealSubject realSubject;
public ProxySubject() {
realSubject = new RealSubject();
}
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("do something before");
realSubject.request();
System.out.println("do something after");
}
}
4、TestISubject.java
package proxy;
/**
* @author Chu
* @version 创建时间:2013-06-13 上午08:41:32
*/
public class TestISubject {
public static void main(String[] args) {
// TODO Auto-generated method stub
ISubject proxySubject = new ProxySubject();
proxySubject.request();
}
}
【运行结果】如下:
do something before
realSubject requesting...
do something after
观察代码可以发现每一个代理类只能为一个接口服务,这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码。解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,那么此时就必须使用动态代理完成。动态代理将在下一篇日志中做详细介绍。