定义
为其它对象提供一个代理以控制对这个对象的访问。
使用场景
延迟初始化(虚拟代理),对于偶尔使用的重量级服务,一直保持该对象的运行会消耗系统资源时可以使用代理。无需在程序启动时就创建该对象, 可将对象的初始化延迟到真正有需要的时候。
访问控制(保护代理)。如果只希望特定客户端使用服务对象,这里的对象可以是操作系统中非常重要的部分,而客户端则是各种已启动的程序(包括恶意程序),此时可使用代理模式。代理可仅在客户端凭据满足要求时将请求传递给服务对象。
本地执行远程服务(远程代理)。适用于服务对象位于远程服务器上的情形。在这种情形中,代理通过网络传递客户端请求,负责处理所有与网络相关的复杂细节。
记录日志请求(日志记录代理)。适用于当需要保存对于服务对象的请求历史记录时。代理可以在向服务传递请求前进行记录。
智能引用。可在没有客户端使用某个重量级对象时立即销毁该对象。代理会将所有获取了指向服务对象或其结果的客户端记录在案。代理会时不时地遍历各个客户端,检查它们是否仍在运行。如果相应的客户端列表为空,代理就会销毁该服务对象, 释放底层系统资源。代理还可以记录客户端是否修改了服务对象。其他客户端还可以复用未修改的对象。
代码实现
public interface Image {
void display();
}
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);
}
}
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();
}
}
public class ProxyTest {
@Test
public void test() {
Image image = new ProxyImage("test_10mb.jpg");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}
Loading test_10mb.jpg
Displaying test_10mb.jpg
Displaying test_10mb.jpg
作者:作茧自缚z
链接:https://juejin.cn/post/6957726994071027720
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。