`
zsjg13
  • 浏览: 138325 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

代理模式

阅读更多

代理模式:是对象的结构模式,它给某个对象提供一个代理对象,并由代理对象控制对原对象的引用。

 

所谓代理,就是一个人或一个机构代表另一个人或另一个机构采取行动。

 

代理模式的结构:抽象主题、代理主题,真实主题。
(1)抽象主题
package com.javapatterns.proxy;
public abstract class Subject {
    public abstract void request();
}
(2)真实主题
package com.javapatterns.proxy;
public class RealSubject extends Subject {
    public RealSubject() {}
    public void request() {
        System.out.println("From real subject.");
    }

(3)代理主题
package com.javapatterns.proxy;
public class ProxySubject extends Subject {
    private RealSubject realSubject;
    public ProxySubject() {}
    public void request() {
        preRequest();
        if ( realSubject == null ) {
            realSubject = new RealSubject();
        }
        realSubject.request();
        postRequest();
    }
}
怎样调用代理主题?
Subject subject = new ProxySubject();
subject.request();

 

Java 2.0对代理模式的支持
自从JDK 1.3,java.lang.reflect包提供了直接支持代理模式的3个类:Proxy、InvocationHandler,Method。

 

Proxy类使得设计师能够在运行时间创建代理对象,当系统有了一个代理对象后,对原对象的方法的调用,会分派给一个调用处理器(Invocation Handler)。程序可以在调用处理器的invoke()方法中截获这个调用。

 

package com.javapatterns.proxy.reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
import java.util.Vector;
import java.util.List;

public class VectorProxy implements InvocationHandler {
    private Object proxyobj;

    public VectorProxy(Object obj) {
        proxyobj = obj;
    }

 public static Object factory(Object obj) {
  Class cls = obj.getClass();
        return Proxy.newProxyInstance( cls.getClassLoader(),
            cls.getInterfaces(),
            new VectorProxy(obj) );
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  System.out.println("before calling " + method);
        if (args != null) {
   for (int i=0; i<args.length; i++) {
                System.out.println(args[i] + "");
            }
  }
        Object o = method.invoke(proxyobj, args);
  System.out.println("after calling " + method);
        return o;
    }

    public static void main(String[] args) {
  List v = null;
        v = (List) factory(new Vector(10));
        v.add("New");
        v.add("York");
    }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics