本帖最后由 王文正 于 2013-2-26 13:21 编辑
我来回答您的问题 希望对您有帮助
所谓Dynamic Proxy是这样一种class: 它是在运行时生成的class,在生成它时你必须提供一组interface给它,
然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。
当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,
由它接管实际的工作。
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
举个例子如下:
- 抽象角色:
- abstract public class Subject{
- abstract public void request();
- }
- 真实角色:实现了Subject的request()方法。
- public class RealSubject extends Subject{
- public RealSubject(){
- }
- public void request() {
- System.out.println("From real subject.");
- }
- }
- 代理角色:
- public class ProxySubject extends Subject {
- private RealSubject realSubject; //以真实角色作为代理角色的属性
- public ProxySubject() { }
- public void request(){ //该方法封装了真实对象的request方法
- preRequest();
- if( realSubject == null ){
- realSubject = new RealSubject();
- }
- realSubject.request(); //此处执行真实对象的request方法
- postRequest();
- }
- private void preRequest(){
- //something you want to do before requesting
- }
- private void postRequest(){
- //something you want to do after requesting
- }
- }
- 客户端调用:
- Subject sub=new ProxySubject();
- Sub.request();
由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题
|