设计模式 四人帮_四人帮–代理设计模式

设计模式 四人帮

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

何时使用此模式?

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

有哪些使用场景?

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

有趣的一点:

  • 相关模式之间几乎没有差异。 像适配器模式为主题提供了不同的接口,而代理模式提供了与原始对象相同的接口,而装饰器提供了增强的接口。 装饰器模式在运行时添加了其他行为。
  • 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/351519.shtml

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

相关文章

uniq 去除重复命令使用方法介绍

Linux Shell学习:uniq命令使用方法介绍uniq命令的作用:显示唯一的行,对于那些连续重复的行只显示一次!接下来通过实践实例说明. [关键字] Linux Shell uniq 看test.txt文件的内容,可以看到其中的连续重复行 [roothexu.…

sqoop导数据出现问题

执行下面命令的时候报错 ./sqoop import \ --connect jdbc:mysql://mini1:3306/userdb \ --username root \ --password 123456 \ --table emp --m 1 ERROR manager.SqlManager: Error executing statement: java.sql.SQLException: Access denied for user rootmini1 (using p…

java导出jar带第三方库_在.jar文件中导出java库

我仍然是java的新手,我对导出.jar文件非常新.我有一个小游戏,我想发送给一些朋友,我被告知在另一个问题,我应该将它导出到一个可执行的jar文件.好吧,我终于在我的计算机上工作了但是当我把它发送给其他人时它不起作用,因为他们没有图书馆.我正在导入objectdraw库,没有它我的程序…

15分钟内使用Twilio和Stormpath在Spring Boot中进行身份管理

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了! 今天,不到30秒左右的时间…

Spark系列之:使用spark合并hive数据库多个分区的数据到一个分区中

Spark系列之:使用spark合并hive数据库多个分区的数据到一个分区中 把两个分区的数据合并到同一个分区下把其中一个分区的数据通过append方式添加到另一个分区即可 %spark val df spark.sql("select * from optics_prod.product_1h_a where datetime202311142…

window下查看dll, lib文件是32位还是64位

工具:dumpbin.exe 依赖:link.exe, mspdb100.dll 命令: dumpbin /headers E:\math.dll 结果: Dump of file E:\math.dll PE signature found File Type: DLL FILE HEADER VALUES 14C machine (x86) -----…

【转载】分布式之redis复习精讲

注: 本篇文章转自:分布式之redis复习精讲 引言 为什么写这篇文章? 博主的《分布式之消息队列复习精讲》得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章。但是还是要说明一下,复习精讲的文章偏面试准备…

转动风车java_java实现-图的相关操作

importjava.util.LinkedList;public classGraph {private int vertexSize;//顶点的数量private int[] vertexs;//顶点数组private int[][] matrix;//矩阵private boolean[] isVisited;//是否访问过private static final int MAX_WEIGHT 1000;public Graph(intvertexSize){this…

java和golang性能_Java本质和性能

java和golang性能最初的问题是如何计算二进制数中1的个数? 我包含了使用Integer.bitCount()的性能比较,该性能可以转换为固有特性,即单个机器代码指令POPCNT和执行相同功能的Java代码。 题 如何计算二进制数中1的个数…

开源GIS库GDAL/GEOS在Windows下的编译与 Codeblocks配置

最近在研究开源GIS库GDAL,我是采用自己下载源码编译的方式,主要进行以下几个步骤: 编译GEOS,参考自GEOS的wiki 下载GEOS源代码,目前的版本为3.5.0,解压到C盘根目录。打开VS2012自带的命令行工具 进入geo…

Java中.setvalue(-1)_Java State.setValue方法代碼示例

本文整理匯總了Java中org.eclipse.core.commands.State.setValue方法的典型用法代碼示例。如果您正苦於以下問題:Java State.setValue方法的具體用法?Java State.setValue怎麽用?Java State.setValue使用的例子?那麽恭喜您, 這裏精…

使用自定义线程池处理并行数据库流

并行数据库流 在我以前的文章中 ,我写了关于使用并行流和Speedment并行处理数据库内容的信息。 在许多情况下,并行流可能比通常的顺序数据库流快得多。 线程池 Speedment是一个开源的Stream ORM Java工具包和Runtime Java工具,它将现有的数…

GDAL编译Windows平台下64位的方式

最近写的项目需要在64位的服务器上,结果32位下编译的不能用,只好重新编译一套64位的。在编译GDAL时,出现了连接错误,如下: LINK : error LNK2001: unresolved external symbol > _OCTNewCoordinateTransformation a…

CentOS7.x以上版本配置DNS失效解决办法

这2周做实验,centos7.x经常出现yum安装软件包的时候找不到解析地址,提示如下错误 正在尝试其它镜像。Error downloading packages: pam-devel-1.1.8-22.el7.x86_64: [Errno 256] No more mirrors to try. libcom_err-1.42.9-12.el7_5.x86_64: [Errno 256…

java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出

>>#1 票数:41 已采纳使用slf4j无法做到这slf4j 。我想,缺少这个功能的原因是,几乎不可能为slf4j构建一个Level类型,它可以有效地映射到Facade后面所有可能的日志记录实现中使用的Level (或等效)类型。 或者,设计…

使用Cloudformation集成Spring Boot和EC2

在之前的博客中,我们将Spring Boot应用程序与Elastic beantalk集成在一起。 该应用程序是一个基于Servlet的应用程序,可以响应请求。 在本教程中,我们将部署一个Spring Boot应用程序,该应用程序在ec2实例上执行一些计划的任务。 …

出现$ref的原因及解决方案

$ref的产生原因 (1)重复引用:一个集合/对象中的多个元素/属性都引用了同一个对象 (2)循环引用:集合/对象中的多个元素/属性在相互引用导致循环 针对fastjson的处理 fastjson作为一款序列化引擎,…

Wireshark图解教程(简介、抓包、过滤器)

Wireshark是世界上最流行的网络分析工具。这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息。与很多其他网络工具一样,Wireshark也使用pcap network library来进行封包捕捉。可破解局域网内QQ、邮箱、msn、账号等的密码&am…

php格式书写,PHP书写格式详解(必看)

从一个例子开始。启动编辑器,创建一个php文件并键入如下代码:echo "你好!";?>将该文件命名为 test.php 并存储于 E:html 目录下。在浏览器地址栏里访问该 php 文件:http://127.0.0.1/test.php,输出结果如…

java java se_Java SE 11:推动Java前进

java java se介绍 在我看来,这篇文章提出了Java语言应该如何发展成为一种首选语言。 它还提供了一些我喜欢但是有时(可能永远不会)成为Java的一部分的功能,出于某些原因,我将对此加以解释,这些功能有时我已…