代理模式,为其他对象提供一种代理以控制对这个对象的访问。
基本原理:
代理类和实体类都继承同一个接口(或抽象基类),具有相同的功能接口。
代理类内部维护一个实体类对象,真正的功能实现是调用改对象的接口。
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
}
}
代理模式是一种比较常见的模式,比较典型的应用场景:
远程代理(Remote Proxy):为一个对象在不同的地址空间提供局部代表,比如RPC调用。
虚代理(Virtual Proxy):根据需要创建开销大的对象,提高性能。
保护代理(Protection Proxy):用来控制真实对象访问是的饿权限。
智能指针(Smart Reference):取代了简单的指针,它在访问对象时执行一些附加操作,比如C++11中的智能指针。