代理模式: 为其他对象提供一种代理,并以控制对这个对象的访问。 而对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。它是给某一个对象提供一个替代者(占位者),使之在client对象和subject对象之间编码更有效率。代理可以提供延迟实例化(lazy instantiation),控制访问, 等等,包括只在调用中传递。 一个处理纯本地资源的代理有时被称作虚拟代理。远程服务的代理常常称为远程代理。强调控制访问的代理称为保护代理。

代理模式主要用于:

  • 远程代理(Remote Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
  • 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
  • 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
  • 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
  • Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。

代理模式

Subject.java

1
2
3
4
5
6
7
8
package com.yutian.design.proxy;
/**
* Created by wuzhenxing on 16/3/7.
*/
public interface Subject {
void Request();
}

RealSubject.java

1
2
3
4
5
6
7
8
9
10
package com.yutian.design.proxy;
/**
* Created by wuzhenxing on 16/3/7.
*/
public class RealSubject implements Subject{
public void Request() {
System.out.println("真实请求");
}
}

Proxy.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.yutian.design.proxy;
/**
* Created by wuzhenxing on 16/3/7.
*/
public class Proxy implements Subject {
private RealSubject subject;
public void Request() {
if (subject == null) {
subject = new RealSubject();
}
subject.Request();
}
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.Request();
}
}