定义:某个对象比较“敏感”/“私密”/“贵重”,不希望被client直接访问到,故设置代理,在两者之间建立防火墙。
目的:隔离对复杂对象的访问,降低难度/代价,定位在“访问/使用行为”。
图示如下:
Image接口:为了便于改变,访问抽象接口;
RealImage类:本应直接访问,但受限于代价大;
ProxyImage类:创建的代理,可以降低代价;
client:客户端。
举例:
Image接口:
public interface Image { // Image接口
public void display();
}
RealImage类:
public class RealImage implements Image { // RealImage类
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk(filename);
}
// 每次创建都要从磁盘装载,代价高
private void loadFromDisk(String filename) {;}
@Override
public void display() {
System.out.println(filename + " display");
}
}
ProxyImage类:
public class ProxyImage implements Image { // ProxyImage类
private Image realImage;
private String filename;
public ProxyImage(String filename) {
this.filename = filename;
}
@Override
public void display() {
if (realImage == null) { // 如果没有装载,才进行装载
realImage = new RealImage(filename);
}
realImage.display();
}
}
client:
public class Client { // Client
public static void main(String[] args) {
Image image = new ProxyImage("image.jpg");
image.display();
image.display();
}
}
结果:
image.jpg display
image.jpg display