本文共 1928 字,大约阅读时间需要 6 分钟。
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。
在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
根据代理的创建时期,代理模式分为静态代理和动态代理。
代理模式的主要角色如下。
在代码中,一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑,而使调用者无感知。
定义抽象主题类:
package com.siyi.proxypattern;//抽象主题public interface Subject { public void request();}
定义真实主题类:
package com.siyi.proxypattern;//真实主题public class RealSubject implements Subject { public void request() { System.out.println("request..."); }}
定义代理类:
package com.siyi.proxypattern;//代理public class Proxy implements Subject { private Subject subject; public Proxy(Subject subject){ this.subject = subject; } @Override public void request() { preRequest(); subject.request(); postRequest(); } public void preRequest() { System.out.println("before..."); } public void postRequest() { System.out.println("after..."); }}
Main方法:
package com.siyi.proxypattern;public class Main { public static void main(String[] args) { Subject subject = new Proxy(new RealSubject()); subject.request(); }}
运行结果:
before...request...after...
优点:
缺点:
为了解决上面的缺点,所以我们一般使用动态代理。
点击查看:
点击查看:
转载地址:http://qryof.baihongyu.com/