四人帮–代理设计模式

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

何时使用此模式?

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

有哪些使用场景?

  • 虚拟代理–设想一种情况,其中有多个数据库调用来提取大尺寸图像。 由于这是一项昂贵的操作,因此我们可以使用代理模式,该模式将创建多个代理并指向庞大的内存消耗对象进行进一步处理。 仅当客户端首先请求/访问该对象时,才创建真实对象,然后,我们可以仅引用代理来重用该对象。 这避免了对象的重复,从而节省了内存。
  • 远程代理–可以将远程代理视为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,一经查实,立即删除!

相关文章

面试题38_数字在排序数组中出现的次数

题目描写叙述 统计一个数字在排序数组中出现的次数。解题思路 数组是排序的,所以反复出现的数字是相邻排列的。 用二分查找算法,找到第一次出现的位置。和 最后一次出现的位置。 推断第一次出现的位置条件为:当前数字的前一个是否与之相等。若…

Hex hsl 转换 php,关于 RGB,HEX,HSL 颜色相互转换

最近一段时间在折腾一个微信在线编辑器的项目,使用 UEditor 进行二次开发。关于 UEditor 的定制,用到的都太粗浅,官方文档上都能找得到。主题使用的样式表是 ueditor.css 而不是ueditor.min.css,定制主题要注意这一点。而对整个项…

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

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

JAVA基础3——常见关键字解读(1)

常见的JAVA中的关键字 static static静态变量 静态变量:使用static关键字定义的变量。static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被…

PostgreSQL PL / java简介

现代数据库允许以多种语言编写存储过程。 一种常见的实现语言是java.NB,本文讨论了PostgreSQL特定的Java实现。 其他数据库的详细信息会有所不同,但是概念是相同的。 PL / Java的安装 在Ubuntu系统上安装PL / Java很简单。 我将首先创建一个新模板templ…

强连通分量 圆桌骑士

题目描述 圆桌骑士是一个非常吸引人的职业。因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶。现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌。这些骑士将要环绕着坐在…

微信小程序echarts层级太高

项目中因为需求,底部的tab导航栏是自己写的,在开发者工具中一切正常;但是在真机上页面滑动时,echarts的层级比tab高,调过两者的z-index后仍然如此。 经过查找后发现cover-view和cover-image替换tab的view后&#xff0…

php解密 码表,php拼音码表的生成

php拼音码表的生成发布于 2014-09-07 11:12:52 | 90 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛…

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

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

工厂设计模式案例研究

我有一份工作来检查我们的项目代码质量。 如果我在项目中发现任何障碍,必须将其报告给我的团队负责人。 我发现了很多漏洞,我认为可以在博客上进行讨论。 不是嘲笑作者,而是一起学习和改进自己。 像这段代码一样,这是我在我们的代…

【javascript】DOM操作方法(3)——document节点属性

document.doctype //document.documentElement //来获取html元素 document.defaultView //返回document对象所在的window对象 document.body //返回当前文档的<body>节点 document.head //返回当前文档的<head>节点 document.activeElement //返回当前文…

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

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

泽西岛的JSON模式生成

因此&#xff0c;在上一篇文章中&#xff0c;我讨论了一个允许在WADL中使用JSON-Schema的建议&#xff0c;这篇文章探讨了如何使它与最近构建的Jersey一起使用。 在1.16发布之前&#xff0c;您将必须下载/参考1.16SNAPSHOT。 如果您使用的是Maven&#xff0c;那么假设您已经有…

C++map类型 之 简单介绍

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

MySql Socket 完成数据库的增查Demo

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

oracle导数卡死,oracle-审计导数

1、因审计需求&#xff0c;需要将MySQL、Oracle数据库中需要的表数据导入到SqlSERVER进行审计。2、之前的方法&#xff1a;A. oracle组将表dump下来&#xff0c;进行压缩&#xff0c;传送到oracle导数服务器(中转服务器)&#xff0c;再进行还原&#xff0c;然后修改表结构&…

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

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

Java SE 11:推动Java向前发展

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

python之property属性

Property的概念&#xff1a;property是一种特殊的属性&#xff0c;访问它时会执行一段功能&#xff08;函数&#xff09;&#xff0c;然后返回值。 import mathclass Circle:def __init__(self,radius):#园的半径radiusself.radiusradiusproperty#areaproperty(area)def area(s…

Hexo使用细节及各种问题

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