Java与模式之代理(Proxy)模式

上一篇 / 下一篇  2008-04-05 13:01:30 / 个人分类:Java与模式

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

//抽象主体角色
abstract public class Subject
{
    abstract public void request();
}
//代理主体角色
public class ProxySubject extends Subject
{
    private RealSubject realSubject;
 
 public ProxySubject()
 {
 }
 
 public void request()
 {
        preRequest();

  if( realSubject == null )
        {
   realSubject = new RealSubject();
  }

        realSubject.request();

        postRequest();
 }

    private void preRequest()
    {
        //something you want to do before requesting
    }

    private void postRequest()
    {
        //something you want to do after requesting
    }
}
//真实主体角色
public class RealSubject extends Subject
{
 public RealSubject()
 {
 }
 
 public void request()
 {
  System.out.println("From real subject.");
 }
}
//怎样调用代理主题
public class Client
{
   private static Subject subject;

    static public void main(String[] args)
 {
  subject = new ProxySubject();
  subject.request();
  subject.request();
 }
}

一个例子

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;

    /** @link dependency */
    /*#Proxy lnkProxy;*/

    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");
    }
}


TAG: java与模式

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 980
  • 日志数: 47
  • 建立时间: 2008-03-25
  • 更新时间: 2008-09-01

RSS订阅

Open Toolbar