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

java设计模式代理模式

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

  1. java设计模式 订阅模式_Java中的外观设计模式

    java设计模式 订阅模式 立面是指建筑物的外观. 当穿过街道时,我们所看到的只是建筑物的外观. 该工作面抽象了建筑物的所有复杂实现细节. 同样, 外观设计模式旨在为子系统中的一组接口提供统一的接口. ...

  2. java设计模式 订阅模式_Java中的复合设计模式

    java设计模式 订阅模式 当我们必须使用对象的树状分层结构时,复合设计模式非常有用. 它使我们能够统一对待单个对象和对象组成. 它属于结构设计模式的范畴,因为它将对象组合成树形结构以表示部分整个层次 ...

  3. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  4. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  5. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  6. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  7. java设计模式迭代器模式_Java中的迭代器设计模式

    java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...

  8. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

  9. java命令模式_Java中的命令设计模式

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

最新文章

  1. quicklook不能预览office_万物皆可格!给空格键施加神奇魔法的神器软件—快速预览工具QuicklookPC软件...
  2. TongJI Online Judge预赛(2): LOVE LETTER
  3. OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践
  4. Mysql(12)——inner join的用法
  5. 一个java文件里面可以写多少个class
  6. Redis 架构之 cluster
  7. 斑马打印机怎么打印二维码_简单介绍斑马打印机---GX430t
  8. numpy教程:基本输入输出和文件输入输出Input and output
  9. 欧洲冠军联赛决赛结束
  10. 2 Linux基本命令复习2
  11. docker阿里云镜像加速器
  12. python爬取人口数据_爬取人口数据
  13. 计算机教室简笔画图片大全集,教室场景画简笔画图片精选
  14. GitLab CI/CD 基础教程(一)
  15. 【转载】BAPI_GOODSMVT_CREATE FUNCITON FOR MIGO 各种移动类型 源代码参考
  16. 实体-关系图转换为关系模型
  17. 用旧平板打造家庭云数码相框
  18. idea接口测试工具
  19. 网络信息安全之APT攻击
  20. GRUB--多系统启动引导器

热门文章

  1. P3911 最小公倍数之和
  2. P5039 [SHOI2010]最小生成树(网络流)
  3. YBTOJ洛谷P3231:消毒(二分图匹配)
  4. 不止代码:迷宫问题(bfs)
  5. UOJ#33-[UR #2]树上GCD【长链剖分,根号分治】
  6. CF1054D-Changing Array【贪心】
  7. P6047-丝之割【斜率优化,dp】
  8. 和各路巨佬の随机挑战3总结
  9. ssl1016 OJ8467-数的划分 鸣人的影分身【各种dp之8 7】
  10. 势能线段树(均摊分析)