为其他对象提供一种代理以控制对这个对象的访问。
代理模式:
代理和被代理的对象有着相同的行为,而被代理的对象通过和代理实现(合成)组合的关系,然后通过代理展示相应的行为。
下面给出代码示例(代码取至维基百科):
代码解释:(你可以先看代码)
- 我们首先需要定义一个接口,用于设定被代理对象的方法。
- 代理和被代理对象都实现该接口,在被代理对象中的构造器实现正常的事务(即从硬盘中装载图像),而在代理中的构造器不装载图像,在调用代理实现接口的方法时,实例化被代理对象,然后通过被代理对象调用其方法,就可以达到代理对象。
import java.util.*;
interface Image {
public void displayImage();
}
//on System A
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadImageFromDisk();
}
private void loadImageFromDisk() {
System.out.println("Loading " + filename);
}
public void displayImage() {
System.out.println("Displaying " + filename);
}
}
//on System B
class ProxyImage implements Image {
private String filename;
private Image image;
public ProxyImage(String filename) {
this.filename = filename;
}
public void displayImage() {
if(image == null)
image = new RealImage(filename);
image.displayImage();
}
}
class ProxyExample {
public static void main(String[] args) {
Image image1 = new ProxyImage("HiRes_10MB_Photo1");
Image image2 = new ProxyImage("HiRes_10MB_Photo2");
image1.displayImage(); // loading necessary
image2.displayImage(); // loading necessary
}
}
程序的输出为:
Loading HiRes_10MB_Photo1
Displaying HiRes_10MB_Photo1
Loading HiRes_10MB_Photo2
Displaying HiRes_10MB_Photo2
代理模式的应用
- 远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在与不同地址空间的事实。
- 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化,比如说你打开一个很大的HTML网页时,里面可能有很多的文字和图片,但是你还是可以很快打开它,此时你所看到的是所有的文字,但是图片确实一张一张地下载后才能看到,,那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸(浏览器就是用代理模式优化下载的)。
- 安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
智能指引:是指当调用真实对象时,代理处理另一些事情。如计算真实对象的引用次数,或是访问一个实际对象之前,检查是否已经锁定它,以确保其他对象不能改变它。他们都是通过代理在访问一个对象时附加一些内务处理。
代理模式其实就是在访问对象时引入一定程度的间接性。