代理(Proxy)模式

代理模式,为其他对象提供一种代理以控制对这个对象的访问。

基本原理:

  • 代理类和实体类都继承同一个接口(或抽象基类),具有相同的功能接口。

  • 代理类内部维护一个实体类对象,真正的功能实现是调用改对象的接口。


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中的智能指针


书籍推荐