java设计模式代理模式_Java中的代理设计模式

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设计模式代理模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Struts2参数值自动注入到JavaBean对象的属性中和JavaBean对象的属性值展示在页面中

文章目录参数值自动注入示例代码将JavaBean的属性值显示在页面上示例代码参数值自动注入 注意事项&#xff1a; 1.前端界面的表单项的参数命名格式为&#xff1a;Action属性名.JavaBean的属性名 2.Action的属性必须要有setter/getter方法&#xff0c;注入时会调用setter方法 …

ibmmq 通道命令_IBM MQ常用命令

常用命令创建队列管理器crtmqm –q QMgrName-q是指创建缺省的队列管理器删除队列管理器dltmqm QmgrName启动队列管理器strmqm QmgrName如果是启动默认的队列管理器&#xff0c;可以不带其名字停止队列管理器endmqm QmgrName 受控停止endmqm –i QmgrName 立即停止endmqm –p Qm…

算法运行时间中的对数

【0】README 0.1&#xff09; source code and text description are from data structure and alg analysis &#xff1b; 【1】分析算法最混乱的方面大概集中在对数上面&#xff0c; 除分治算法外&#xff0c;可将对数最常出现的规律概括为下列一般法则&#xff1a; 1.1&a…

java项目:永和大王项目_Java项目:书评

java项目:永和大王项目本文是关于这本书的 Peter Verhas撰写的Java Projects Second Edition 我去年写的 这样一篇文章的目的通常是为了促进这本书的销售。 在这种情况下没有什么不同&#xff0c;但是由于这是我写的书&#xff0c;而且我是撰写评论的人&#xff0c;因此赞美这…

Struts2+Hibernate项目中的时间和日期问题

文章目录数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期&#xff0c;而不展示时间日期控件日期时间数据展示问题日期时间数据存储问题场景一场景二场景三场景四数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期&#xff0c;而不展示时间 数…

把一个人的特点写具体作文_把一个人的特点写具体作文

把一个人的特点写具体作文在日常学习、工作抑或是生活中&#xff0c;大家都跟作文打过交道吧&#xff0c;写作文可以锻炼我们的独处习惯&#xff0c;让自己的心静下来&#xff0c;思考自己未来的方向。那要怎么写好作文呢&#xff1f;下面是小编为大家整理的把一个人的特点写具…

spring boot简介_Spring Boot简介

spring boot简介在本教程中&#xff0c;我们将看一下Spring Boot&#xff0c;看看它与Spring框架有何不同。 我们还将讨论Spring Boot提供的各种功能。 什么是Spring Boot&#xff1f; 在开发企业级应用程序时&#xff0c;Spring是一个功能强大的框架。 它为我们提供了诸如依赖…

C语言的运算符的优先级与结合性+ASCII表

【0】README 0.1&#xff09; 内容来源于 C程序设计语言&#xff0c; 旨在整理出C语言的运算符的优先级与结合性&#xff0c; 如下图所示&#xff08;哥子 记了大半年都没有记住&#xff0c;也是醉了&#xff0c;每次都要去翻&#xff09;&#xff1b; 0.2&#xff09; 再补充…

退货退款的售后,如何返还金币/有偿优惠券的问题

假设买家购买了3个商品&#xff0c;商品的销售价是10元&#xff0c;商品总金额是30元 买家应付金额是 30 元&#xff0c;买家使用5个金币抵扣5元&#xff0c;买家实付金额是 25 元。 后来买家退货 2 件&#xff0c;怎么退款和退币呢&#xff1f; 要将金币分摊到每个商品上&a…

python orm框架sqlalchemy_python ORM框架:SqlAlchemy

ORM,对象关系映射&#xff0c;即Object Relational Mapping的简称&#xff0c;通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系&#xff0c;这样做的目的&#xff1a;简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等)&#xff0c;转而直接使用对象模…

javadoc提取工具_使JavaDoc保持最新状态的工具

javadoc提取工具在许多项目中&#xff0c;文档不是最新的。 更改代码后&#xff0c;很容易忘记更改文档。 原因是可以理解的。 在代码中进行更改&#xff0c;然后进行调试&#xff0c;然后希望在测试中进行更改&#xff08;或者&#xff0c;如果您使用的是更多TDD&#xff0c;则…

栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

【0】README 0.1&#xff09; 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤&#xff0c;并给出源代码实现&#xff1b; 0.2&#xff09; 本文中涉及到的源代码均为原创&#xff0c;是对中缀转后缀和计算后缀的简单实现&#xff0c;&#xff08;旨在理清它…

用户/账户/账号的理解

文章目录用户账户账号关系用户 用户概念的理解&#xff1a; 用户就是使用者&#xff0c;可以是个人用户&#xff0c;也可以是机构用户。 账户 账户概念的理解&#xff1a; 账户&#xff0c;所谓“账”&#xff0c;就是系统根据“账”来存储和管理数据&#xff0c;类似记账…

azure 部署java_jClarity:在Azure上升级到Java

azure 部署java在互联世界公共基础设施的新时代&#xff0c;最大和最重要的两个方面是Java和OpenJDK的诞生和兴起。 因此&#xff0c;许多公司将时间和资源投入到构建最先进的技术上&#xff0c;以确保整个行业在未来几年内在AdoptOpenJDK上拥有丰富的质量&#xff0c;而且免费…

黑苹果sd卡认不出来_天生一对:新入苹果M1笔记本,DOCKCASE拓展坞弥补缺憾

2010年刚上大学那会&#xff0c;入手了人生第一台笔记本电脑&#xff0c;两边密密麻麻的各种接口&#xff0c;也没感觉到接口多少的价值&#xff1b;2016年年中入手了人生第一台苹果笔记本&#xff0c;第一次觉得电脑接口不够用&#xff1b;如今四年过去了电脑也到了更新换代的…

利用树的先序和后序遍历打印os中的目录树

【0】README0.1&#xff09;本代码均为原创&#xff0c;旨在将树的遍历应用一下下以加深印象而已&#xff1b;&#xff08;回答了学习树的遍历到底有什么用的问题&#xff1f;&#xff09;你对比下linux 中的文件树 和我的打印结果就明理了&#xff1b;0.2&#xff09;我们采用…

Hibernate常用API

文章目录删除指定的记录新增记录更新记录清空缓存将实体对象从缓存中清除将缓存中更新的数据同步到数据库把数据库中的数据刷到缓存中查询多个对象&#xff08;也就是查询多条记录&#xff09;查询指定ID的对象&#xff08;查询指定ID值的记录&#xff09;参考删除指定的记录 U…

solid设计原则_SOLID设计原则

solid设计原则介绍&#xff1a; Robert C. Martin定义了五项面向对象的设计原则&#xff1a; 小号英格尔-责任原则 笔封闭原则 大号 iskov的替换原则 我覆盖整个院落分离原则&#xff0c;并 d ependency倒置原则 这些一起被普遍称为SOLID原则。 在设计面向对象的系统时&a…

nosql简答什么是最终一致性_NoSql的三大基石:CAP理论BASE最终一致性

关系型数据库的局限NoSql出现在关系型数据库之后&#xff0c;主要是为了解决关系型数据库的短板&#xff0c;我们先来看看随着软件行业的发展&#xff0c;关系型数据库面临了哪些挑战&#xff1a;1、高并发一个最典型的就是电商网站&#xff0c;例如双11&#xff0c;几亿大军的…

二叉树的先中后序遍历

【0】README 0.1&#xff09;本文旨在理清二叉树的先中后序遍历&#xff0c; 以及如何建立二叉树等相关内容&#xff1b; 0.2&#xff09;本文涉及代码均为原创&#xff1b; 0.3&#xff09;本文中遍历后的打印结果&#xff0c;朋友您可以直接写出二叉树的节点构造出来&…