一. 简述
为其他对象提供一种代理以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
属于结构型模式。
二. 组成
-
抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。
- 真实主题角色(RealSubject)角色:定义了代理角色所代表的真实对象。
- 代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;控制真实主题的应用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对象。
三. UML类图
四. 基本代码
// 抽象主题角色
public interface Subject {
public void Request();
}
// 真实主题角色
public class RealSubject implements Subject {
public void Request() {
System.out.println("Called RealSubject.Request()");
}
}
// 代理主题角色
public class Proxy implements Subject {
private RealSubject realSubject;
public void Request() {
if(realSubject == null) {
realSubject = new RealSubject();
}
preRequest();
realSubject.Request();
postRequest();
}
private void preRequest() {
System.out.println("PreRequest.");
}
private void postRequest() {
System.out.println("PostRequest."); }
}
// 客户端调用
public class Client {
public static void main(String[] args) {
Proxy p = new Proxy();
p.Request();
}
}
五. 优缺点
优点:
六. 应用场景
- 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。如WebService;
-
虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。比如说打开一个很大的HTML网页,里面可能有很多文字和图片,文字可以很快就能看到,但是图片要一张一张的下载,那些未打开的图片框就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图的路径和尺寸,这样可以优化下载。
-
安全代理:用来控制真实对象访问时的权限,一般用于对象有不同访问权限的时候。
- 智能引用:是指当调用真实的对象时,代理处理另外一些事。