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

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

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

为什么要使用代理?

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

  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

Java中的代理设计模式相关推荐

  1. Java中23种设计模式(随时不定时更新)

    一.创建型模式 1.单例模式(Singleton Pattern) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种模式涉及到一个单一的类,该类负责创建自己的对 ...

  2. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  3. Java中的策略设计模式

    策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...

  4. Java中的命令设计模式

    在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...

  5. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  6. Java中的Memento设计模式-示例教程

    记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保 ...

  7. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

  8. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  9. Java中的迭代器设计模式–示例教程

    迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...

最新文章

  1. 连续投影算法_出货量第一,专利300+,极米科技如何成为“投影一哥”?
  2. js 空数组是true还是false
  3. DbHelper数据操作类,DbProviderFactories
  4. boost::spirit模块实现自定义用作容器数据的测试程序
  5. hazelcast_Java:如何在不到5分钟的时间内通过Hazelcast提高生产力
  6. arcgis批量按掩膜提取栅格
  7. Unity Shader:Waveform波形(3)-复合波
  8. 机器学习第三回——正则化
  9. @程序员 腾讯云计算机视觉应用干货,不容错过!
  10. Linux内核私闯进程地址空间并修改进程内存
  11. 1. 遥控器-华科尔Devo7e 改造成为支持 dsm2/dsmx 的多制式遥控器
  12. 混沌工程-为什么推广的如此困难
  13. MDWechat(微信美化)
  14. Python(1-10章)知识点
  15. 全球与中国塑料输送机滚筒市场深度研究分析报告
  16. 欧美女性flash网页模板
  17. 嵌入式 html 解析文件,嵌入式软件测试——方法、案例与模板详解.html.pdf
  18. 三维重建之人体重建PIFU,PIFuHD
  19. 开源至上:java前端框架排行
  20. 2020张宇1000题【好题收集】【第三章:一元函数积分学】

热门文章

  1. 【2018.5.19】模拟赛之二-ssl2433 文件名排序【字符串】
  2. 【交互】Omkar and the Meaning of Life(CF-1586D)
  3. 【DP】方格计数(nowcoder 20107-B)
  4. NEERC2017 Archery Tournament 线段树 新套路
  5. mybatis源码阅读(四):mapper(dao)实例化
  6. 深入解读Service Mesh背后的技术细节
  7. java.nio.ByteBuffer用法小结
  8. spock 集成测试_使用Spock 1.2简化对遗留应用程序的集成测试
  9. 创建react应用程序_使用SpringWebFlux的React式Web应用程序
  10. 得到appd url_AppD方法:Java 9支持