代理设计模式(Proxy Pattern)

描述: 代理设计模式就是一个对象代表另外一个对象的功能, 也就是指客户端并不直接调用实际的对象,而是通过中间的代理对象来间接的调用实际对象, 这种设计设计模式属于结构模式。

核心思想: 为对象提供一种以代理对象控制这个对象的访问

使用场景: 想访问一个类时做一些额外的操作,比如添加日志等

代理设计模式的优点:

  • 职责清晰
  • 高扩展

代理设计模式的缺点:

  • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  • 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

示例:

  • 创建一个接口
1
2
3
public interface Image {
void display();
}
  • 创建实现接口的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class RealImage implements Image {

private String fileName;

public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}

@Override
public void display() {
System.out.println("Displaying " + fileName);
}

private void loadFromDisk(String fileName){
System.out.println("Loading " + fileName);
}
}
  • 代理类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ProxyImage implements Image{

private RealImage realImage;
private String fileName;

public ProxyImage(String fileName){
this.fileName = fileName;
}

@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
  • 调用
1
2
3
4
5
6
7
8
9
10
11
12
public class ProxyPatternDemo {

public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");

// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}