四人帮–代理设计模式

代理是另一种结构设计模式 ,可以“代表”另一个对象或“代替”另一个对象以访问后面的对象。

何时使用此模式?

当我们需要创建一个包装来覆盖客户端的主要对象的复杂性时,将使用代理模式。

有哪些使用场景?

  • 虚拟代理–设想一种情况,其中有多个数据库调用来提取大尺寸图像。 由于这是一项昂贵的操作,因此我们可以使用代理模式,该模式将创建多个代理并指向庞大的内存消耗对象进行进一步处理。 仅当客户端首先请求/访问该对象时,才创建真实对象,然后,我们可以仅引用代理来重用该对象。 这避免了对象的重复,从而节省了内存。
  • 远程代理–可以将远程代理视为RPC调用中的存根。 远程代理提供了在不同地址位置中存在的对象的本地表示。 另一个示例可以是为远程资源(例如Web服务或REST资源)提供接口。
  • 保护性代理–保护性代理充当授权层,以验证实际用户是否有权访问适当的内容。 可以考虑一个有关在办公室中提供受限Internet访问的代理服务器的示例。 仅允许使用有效的网站和内容,其余的将被阻止。
  • 智能代理–智能代理通过在访问对象时插入特定操作来提供附加的安全层。 一个示例可以是在访问真实对象之前检查它是否已锁定,以确保没有其他对象可以更改它。


结构体:

代理设计模式结构


参加者:

  • 主题–此对象定义RealSubject和Proxy的通用接口,以便可以在需要RealSubject的任何地方使用Proxy。
  • 代理–维护对RealSubject的引用,以便代理可以访问它。 它还实现了与RealSubject相同的接口,因此可以使用Proxy代替RealSubject。 代理还控制对RealSubject的访问,并且可以创建或删除此对象。
  • RealSubject –这是代理代表的主要对象。


例:

我们将在本文中讨论两个示例。 第一个是虚拟代理模式,另一个是保护代理模式。

虚拟代理示例

如前所述,虚拟代理对于节省昂贵的内存资源很有用。 让我们以实际图像包含客户端需要访问的巨大数据为例。 为了节省我们的资源和内存,实现如下:

  • 创建一个供客户端访问的接口。 其所有方法将由ProxyImage类和RealImage类实现。
  • RealImage在其他系统上运行,并且包含可从数据库访问的图像信息。
  • 在其他系统上运行的ProxyImage可以在新系统中表示RealImage。 使用代理,我们可以避免多次加载图像。

类图:

虚拟代理示例

代码示例:

图像.java

public interface Image {public void showImage();
}

RealImage.java

public class RealImage implements Image {private String fileName = null; public RealImage(String strFileName){this.fileName = strFileName;}@Overridepublic void showImage() {System.out.println('Show Image:' +fileName);}
}

ProxyImage.java

public class ProxyImage implements Image {private RealImage img= null;private String fileName = null;public ProxyImage(String strFileName) {this.fileName = strFileName;}/** (non-Javadoc)* @see com.proxy.virtualproxy.Image#showImage()*/@Overridepublic void showImage() {if(img == null){img = new RealImage(fileName);}img.showImage();}
}

客户端程序

public class Client {
public static void main(String[] args) {final Image img1 = new ProxyImage('Image***1');final Image img2 = new ProxyImage('Image***2');img1.showImage();img2.showImage();}
}


保护代理示例:

  • 假设ABC公司启动了一项新政策,即根据其角色现在禁止员工访问Internet。 所有外部电子邮件网站将被阻止。 在这种情况下,我们创建InternetAccess接口,该接口由操作GrantInternetAccess()组成。
  • RealInternetAccess类,允许所有人访问互联网。 但是,为了限制此访问,我们将使用ProxyInternetAccess类,该类将检查用户的角色并根据其角色授予访问权限。

类图:

保护代理示例

代码示例:

互联网:

public interface InternetAccess {public void grantInternetAccess();
}

RealInternetAccess.java

public class RealInternetAccess implements InternetAccess {private String employeeName = null;public RealInternetAccess(String empName) {this.employeeName = empName;}@Overridepublic void grantInternetAccess() {System.out.println('Internet Access granted for employee: '+ employeeName);}
}

ProxyInternetAccess.java

public class RealInternetAccess implements InternetAccess {private String employeeName = null;public RealInternetAccess(String empName) {this.employeeName = empName;}@Overridepublic void grantInternetAccess() {System.out.println('Internet Access granted for employee: '+ employeeName);}
}

客户端程序

public static void main(String[] args) {InternetAccess ia = new ProxyInternetAccess('Idiotechie');ia.grantInternetAccess();}


优点:

  • 如您在上面的示例中看到的,代理模式的优点之一是关于安全性。
  • 这种模式避免了对象的重复,这些对象可能是巨大的并且占用大量内存。 反过来,这可以提高应用程序的性能。
  • 远程代理还通过在客户端计算机上安装本地代码代理(存根),然后借助远程代码访问服务器来确保安全性。

缺点/后果:

这种模式引入了另一层抽象,如果某些客户端直接访问RealSubject代码,而其中一些可能访问Proxy类,则有时可能会遇到问题。 这可能会导致不同的行为。

有趣的一点:

  • 相关模式之间几乎没有差异。 就像Adapter模式为其主题提供不同的接口,而Proxy模式提供与原始对象相同的接口,而装饰器提供增强的接口。 装饰器模式在运行时添加了其他行为。
  • Java API中使用的代理:java.rmi。*;

请不要忘记发表您的评论。 如果您喜欢本文,请通过社交网络链接为您的朋友分享此文章。

下载示例代码:


参考: Idiotechie博客上来自JCG合作伙伴 Mainak Goswami 的“四人帮–代理设计模式” 。

翻译自: https://www.javacodegeeks.com/2012/11/gang-of-four-proxy-design-pattern.html

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

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

相关文章

使用inetaddress测试目标可达性_PDPS软件机器人虚拟仿真:Smart Place功能介绍与使用方法...

概述对于机器人工作站或生产线的虚拟仿真,很大一部分的作用是找出机器人与工装夹具等外围设备的最佳布局位置。市面上大多数的工业机器人虚拟仿真软件都有这种专门用于检测机器人与外围设备之间最佳布局位置的功能,比如DELMIA软件中的“Auto Place”功能…

angular js 使用pdf.js_排名靠前的几个JS框架发展趋势和前景

转载自:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。原文出处:https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02随着信息技术领域的发展,企业…

debian dhcp服务启动不了_DHCP服务器配置

DHCP = Dynamic Host Configuration Protocol 基于TCP/IP,用于动态配置工作站网络接口,使工作站的网络接口管理自动化。DHCP服务器软件dhcpd网站:http://www.isc.org安装方法:#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

C++map类型 之 简单介绍

一:map的前世今生(1)从关联容器与顺序容器说起。关联容器通过键(key)存储和读取元素。而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等)。关联容器&#xff0…

MySql Socket 完成数据库的增查Demo

需求: 利用MySql数据库结合前端技术完成用户的注册(要求不使用Web服务技术),所以 Demo采用Socket技术实现Web通信. 第一部分:数据库创建 数据库采用mysql 5.7.18, 数据库名称为MyUser, 内部有一张表 user.字段有 Id,UserName,Psd,Tel 第二部分:数据库连接与Socket通信 创建控…

苹果桌面主题_看腻了手机自带的桌面主题,试试这个

在这个看脸的时代,颜值似乎越来越重要了。尤其是我们每天都要看到的手机桌面,如果它的颜值好一点,也许我们的心情会更好,所以有不少人都用手机自带的主题来美化桌面,但是对于喜欢个性的我们,手机自带的主题…

Java SE 11:推动Java向前发展

介绍 在我看来,这篇文章提出了Java语言应该如何发展以保持其作为首选语言的地位。 它还提供了一些我喜欢但有时(可能永远不会)成为Java一部分的功能,由于我将要解释的某些原因,这些功能有时我已经爱上了。 我真的很想…

Hexo使用细节及各种问题

解决markdown图片不显示(返回403 forbidden)、添加本地图片无法显示、修改文章page模板、同时部署发布同步到多个仓库站点(Github、coding、gitee 码云) 图片不显示 在使用过程中,会发现有的引用图片无法显示的问题。但是如果直接复制图片地址到浏览器打开的话显示…

智能小车37:异常在ARM、JAVA、硬件里的实现

几乎所有编程语言都有异常,可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题,下面给大家分享一下。 一、Arm的中断。 1.触发异常 2.保存现场 3.cpu进入异常工作模式,程序指针(pc)跳入异常入口&…

c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...

撇开人的因素在自行车的组件中对车速影响最大的几项是什么?车重?自锁?轮组?传动?我的个人感受,从提高幅度上来讲,而不是重要性上来讲一、自锁起码提高你50%的速度,我不用自锁和别人一起走AVS25就很辛苦了,用了自锁&#xff0…

哈希三道题

两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意…

zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例

目前超过两千人的光学与光学设计方面的微信公众号,欢迎您!穿越十年的一个ZEMAX光学设计案例作者:窗台小绿萝CAD,这个词已经深入到学习、工作很多年,翻译过来就是Computer Aided Design,计算机辅助设计。随着…

php基础是什么,php基础学什么?

有不少同学想要学习 PHP,但又不清楚 PHP 基础学什么,那么这篇文章告诉你。熟悉前端开发语言学习 PHP 之前,首先要学习前端语言包括 HTML、CSS、JS 等。等对前端语言有个大致掌握后,能编写一个 web 静态页面。学习 PHP 基本语法和函…

名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...

生鲜电商的特点有哪些?生鲜电商特点:1,生鲜电商具有粘性高、重复购买率高、毛利高的“三高”特性;2,生鲜食品需要保鲜、冷藏、冷冻;3,生鲜食品保质期比较短;保存不易、对物流配送的条件要求极高;4,生鲜商品…

番石榴函数和Java 8 Lambdas

我最近阅读了Brian Goetz的《 Lambda的状况》 ,在阅读了该文章之后,我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类,其中ActionListener是规范示例。 这些“…

关于源码,反码,补码(正数--负数)---------(-128)自己的理解

以一个字节为例 1、无符号位,一个字节可以存放0~255共256个数字;有符号位存放-128~127共256个数字; 2、无符号全都表示为正数;有符号位则首位表示正负数,正数首位为0,负数首位为1(因此在判断一个…

英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...

英特尔近期宣布推出无可比拟的5G基础设施芯片产品组合,包括一款面向无线基站的10纳米片上系统(SoC)英特尔凌动P5900,和一款面向5G网络处理的结构化ASIC,一款针对5G网络优化、提供基于GPS的高精度网络服务同步功能的以太网适配器。此外&#x…

canvas离屏技术与放大镜实现

教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)canvas 离屏技术与放大镜实现。 更多讨论或者错误提交,也请移步。 利用canvas除了可以实现滤镜,还可以利用离屏技术放大镜功能。为了方…

使用Ajax的Spring MVC REST调用

这篇文章提供了对Spring MVC Web应用程序的REST调用的简单示例。 它基于在Spring MVC上下文示例中使用Spring MVC服务静态资源和使用Ajax获取JSON 。 该代码可在GitHub的Spring-REST-With-Ajax目录中找到。 主页 我们的主页包含与执行Ajax调用的Javascript函数链接的四个按钮…

linux7系统如何配置网卡,Linux 7 配置网卡(nmcli)

操作系统版本:[rootcjcos01 network-scripts]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 7.5 (Maipo)查看网卡、IP等信息:[rootcjcos01 ~]# ifconfigenp0s3: flags4163 mtu 1500inet 192.168.1.90 netmask 255.255.255.0 bro…