Java中的代理设计模式

代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它们。

代理设计模式是一种结构模式,其中代理类包装了实际的主题类。 客户代码仅与代理类交互,而不与真实主题交互。

在本教程中,我们将学习如何实现代理设计模式。

为什么要使用代理?

在三种最常见的情况下,我们可能需要代理类:

  1. 虚拟代理:当主题实例化需要大量资源时,我们可以选择使用此模式。 我们在此处创建的代理类称为虚拟代理。 一些示例用例将包括在网页上加载非常高分辨率的图像。 想法是将昂贵的资源的创建延迟到需要的时间为止
  2. 保护代理:我们还可以使用代理类来控制对真实主题类的访问。 例如,允许用户根据其特定用户角色访问网站
  3. 远程代理:此实现的真实示例是Google Docs。 Web浏览器将代理对象保存在本地,然后与远程服务器上的对象同步

UML图:

代理设计模式包含以下组件:

  • 主题:定义实际主题合同的接口
  • RealSubject这是我们要为其提供代理的类
  • 代理:这是真实主题的代理类。 ProxyRealSubject类均实现Subject接口
  • 客户端通过Subject接口与代理交互的类

ProxyRealSubject类均实现Subject接口。 同样,客户端与Subject界面进行交互,因此它隐藏了客户端与代理进行交互而不是真实主题的事实。

代理类包装实际主题,并且可以将一些请求委托给真实主题。 但是,并非所有请求都委托给Subject类 代理能够处理一些较轻的职责。

示例实现:

大多数组织在其场所内提供受限的Internet访问权限。 那么,如何实施呢?

这个想法是创建一个保护代理。

让我们先定义一个WebServer接口:

 public interface WebServer { 
     void makeRequest(String url);  } 

在这里, makeRequest()方法负责使用特定端点对Web服务器进行调用。

现在,让我们实现RealWebServer类,该类完成通过网络API调用命中URL的实际工作:

 public class RealWebServer implements WebServer {     
     @Override 
     public void makeRequest(String url) { 
     //code to hit a particular url 
     }  } 

最后,我们将创建一个代理服务器并将其公开给我们的客户:

 public class ProxyServer implements WebServer {  
     private RealWebServer realServer; 
     private List<String> blockedSites = new ArrayList<>();  
     public ProxyWebServer() { this .realServer = new RealWebServer(); } RealWebServer(); }  
     public void blockWebsite(String url) { 
         this .blockedSites.add(url); 
     }  
     @Override 
     public void makeRequest(String url) { 
         if (!blockedSites.contains(url)) { 
             this .realServer.makeRequest(url); 
         } 
         else { 
             System.out.println( "This website is blocked. Contact your administrator" ); 
         } 
     }  } 

这样一来,所有被阻止的网站将在场所内不可用:

 //code in main method  WebServer server = new ProxyWebServer();  server.blockWebsite( "www.facebook.com" );  ...  server.makeRequest( "www.facebook.com" ); 
   // Prints 'This website is blocked. Contact your administrator' 

结论:

在本教程中,我们探讨了代理设计模式。

代理模式使我们可以推迟创建昂贵的资源,直到需要它为止,控制对真实主题的访问或在本地表示远程对象。

Java Reflection API依赖于代理。 同样,Hibernate的惰性获取逻辑在内部使用了这种模式。

翻译自: https://www.javacodegeeks.com/2019/09/proxy-design-pattern-java.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值