Java中的代理设计模式
代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它们。
代理设计模式是一种结构模式,其中代理类包装了实际的主题类。 客户代码仅与代理类交互,而不与真实主题交互。
在本教程中,我们将学习如何实现代理设计模式。
为什么要使用代理?
在三种最常见的情况下,我们可能需要代理类:
- 虚拟代理:当主题实例化需要大量资源时,我们可以选择使用此模式。 我们在此处创建的代理类称为虚拟代理。 一些示例用例将包括在网页上加载非常高分辨率的图像。 想法是将昂贵的资源的创建延迟到需要的时间为止
- 保护代理:我们还可以使用代理类来控制对真实主题类的访问。 例如,允许用户根据其特定用户角色访问网站
- 远程代理:此实现的真实示例是Google Docs。 Web浏览器将代理对象保存在本地,然后与远程服务器上的对象同步
UML图:
代理设计模式包含以下组件:
- 主题:定义实际主题合同的接口
- RealSubject :这是我们要为其提供代理的类
- 代理:这是真实主题的代理类。 Proxy和RealSubject类均实现Subject接口
- 客户端 :通过Subject接口与代理交互的类
Proxy和RealSubject类均实现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中23种设计模式(随时不定时更新)
一.创建型模式 1.单例模式(Singleton Pattern) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种模式涉及到一个单一的类,该类负责创建自己的对 ...
- 第80节:Java中的MVC设计模式
第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...
- Java中的策略设计模式
策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...
- Java中的命令设计模式
在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...
- Java中的状态设计模式–示例教程
状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...
- Java中的Memento设计模式-示例教程
记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保 ...
- Java中的访问者设计模式–示例教程
访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...
- Java中的策略设计模式-示例教程
策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...
- Java中的迭代器设计模式–示例教程
迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...
最新文章
- 连续投影算法_出货量第一,专利300+,极米科技如何成为“投影一哥”?
- js 空数组是true还是false
- DbHelper数据操作类,DbProviderFactories
- boost::spirit模块实现自定义用作容器数据的测试程序
- hazelcast_Java:如何在不到5分钟的时间内通过Hazelcast提高生产力
- arcgis批量按掩膜提取栅格
- Unity Shader:Waveform波形(3)-复合波
- 机器学习第三回——正则化
- @程序员 腾讯云计算机视觉应用干货,不容错过!
- Linux内核私闯进程地址空间并修改进程内存
- 1. 遥控器-华科尔Devo7e 改造成为支持 dsm2/dsmx 的多制式遥控器
- 混沌工程-为什么推广的如此困难
- MDWechat(微信美化)
- Python(1-10章)知识点
- 全球与中国塑料输送机滚筒市场深度研究分析报告
- 欧美女性flash网页模板
- 嵌入式 html 解析文件,嵌入式软件测试——方法、案例与模板详解.html.pdf
- 三维重建之人体重建PIFU,PIFuHD
- 开源至上:java前端框架排行
- 2020张宇1000题【好题收集】【第三章:一元函数积分学】
热门文章
- 【2018.5.19】模拟赛之二-ssl2433 文件名排序【字符串】
- 【交互】Omkar and the Meaning of Life(CF-1586D)
- 【DP】方格计数(nowcoder 20107-B)
- NEERC2017 Archery Tournament 线段树 新套路
- mybatis源码阅读(四):mapper(dao)实例化
- 深入解读Service Mesh背后的技术细节
- java.nio.ByteBuffer用法小结
- spock 集成测试_使用Spock 1.2简化对遗留应用程序的集成测试
- 创建react应用程序_使用SpringWebFlux的React式Web应用程序
- 得到appd url_AppD方法:Java 9支持