场景
中秋假期到了,李敏要到火车站买张回家的车票,发现去趟车站太远了,于是选择学校附近的票务中心,让票务中心的工作人员帮自己买票。
具体分析
在上面的例子中,“买票”是业务操作,票务中心帮忙买票,那么“票务中心”是代理角色,真正要买票的是李敏,所以“李敏”是具体角色。
在这个过程中,票务中心承担了代理的角色,实现了买票的业务需求,那么,在java面向对象编程中,也有一种类似的设计模式,叫代理模式。
定义
对其他对象提供一种代理以控制对这个对象的访问
类图
模式中的角色与职责
- AbstractObject
抽象角色。
一个普通的业务类型定义。
interface abstractObject{
public void operation();
}
- RealObject
具体角色。
业务逻辑的具体执行者。
class RealObject implements abstractObject{
@Override
public void operation() {
System.out.println("真实的操作");
}
}
- ProxyObject
代理角色。
实现了业务逻辑。
class ProxyObject implements abstractObject{
RealObject realObject;
@Override
public void operation() {
if(realObject == null){
realObject = new RealObject();
}
realObject.operation();
}
}
客户端实现
public class ProxyTest {
public static void main(String[] args) {
ProxyObject proxyObject = new ProxyObject();
proxyObject.operation();
}
}
应用形式
远程代理(Remote Proxy)
为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
虚拟代理(Virtual Proxy)
根据需要创建开销很大的对象。 通过它来存放实例化需要很长时间的真实对象。
比如打开一个很大的HTML网页时,里面可能有很多的文字和图片,但是你可以很快打开它,此时你所看到的是所有的文字,但图片却是一张一张地下载后才能看到。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。
安全代理
用来控制真实对象访问时的权限。
智能引用代理(Smart Reference Proxy)
指当调用真实的对象时,代理处理另外一些事。