一、 Proxy模式定义:为其他对象提供一种代理以控制这个对象的访问。二、 模式解说Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层,这个访问层也叫代理。Proxy模式是最常见的模式,在我们生活中处处可见,例如我们买火车票不一定非要到火车站去买,可以到一些火车票的代售点去买。寄信不一定是自己去寄,可以把信委托给邮局,由邮局把信送到目的地,现实生活中还有很多这样的例子,就不一一列举了。
uml类图如下所示:
三、举一个比较俗的例子,一个男孩boy喜欢上了一个女孩girl,男孩一直想认识女孩,直接去和女孩打招呼吧,又觉得不好意思(这个男孩比较害羞)。于是男孩想出了一个办法,委托女孩的室友Proxy去帮他搞定这件事(获得一些关于女孩的信息,如有没有BF等,这就叫知己知彼,才能百战不殆)。下面给出这个例子的程序实现:
public interface GirlInfo { public void hasBoyFriend(); } public class Girl implements GirlInfo { public void hasBoyFriend() { System.out.println("还没有男朋友"); } } //代理也继承了接口 public class Proxy implements GirlInfo { private GirlInfo _girl; public Proxy(GirlInfo girl) { _girl = girl; } public void hasBoyFriend() { _girl.hasBoyFriend(); } } public class Client { public static void main(String[] args) { GirlInfo girl = new Girl(); //获得代理类都运用代理类 Proxy proxy = new Proxy(girl); // proxy.hasBoyFriend(); } }
有的书上称这种实现为静态代理,之所以这样是为了区别于Proxy模式在jdk中的另一种实现,jdk中的实现称为动态代理。下面用jdk中的方法给出这个例子的实现。代码如下:public interface GirlInfo { public void hasBoyFriend(); } public class Girl implements GirlInfo { public void hasBoyFriend() { System.out.println("还没有男朋友"); } } import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class GirlProxy implements InvocationHandler { private Object delegate; //得到某一类实例 public Object bind(Object delegate) { this.delegate = delegate; return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理处理前"); method.invoke(delegate, args); System.out.println("代理处理后"); return null; } } public class ProxyClient { public static void main(String[] args) { //新建代理类 GirlProxy girlProxy = new GirlProxy(); //通过代理类得到该实体类 GirlInfo girl = (GirlInfo) girlProxy.bind(new Girl()); //执行方法 girl.hasBoyFriend(); } }
输出结果:代理处理前还没有男朋友代理处理后